Entendiendo -Weffc ++
Considere el siguiente programa:
#include <string>
struct S {
S (){}
private:
void *ptr = nullptr;
std::string str = "";
};
int main(){}
Esto, cuando se compila con-Weffc++
en GCC 4.7.1, escupirá:
warning: 'struct S' has pointer data members [-Weffc++] warning: but does not override 'S(const S&)' [-Weffc++] warning: or 'operator=(const S&)' [-Weffc++]
Normalmente no hay problema, excepto por un par de cosas con este ejemplo:
Si comento fuera del constructor, la declaración del puntero o la declaración de la cadena, la advertencia desaparece. Esto es extraño porque pensarías que solo el puntero sería suficiente, pero no lo es. Además, al cambiar la declaración de cadena a una declaración de entero, también desaparece, por lo que solo aparece cuando hay una cadena (o probablemente otras clases de elección) con ella. ¿Por qué desaparece la advertencia en estas circunstancias?
Muchas veces esta advertencia aparece cuando todo lo que está haciendo el puntero está apuntando a una variable existente (la mayoría de las veces es mantenida por el sistema operativo). No haynew
, y nodelete
. Cuando la clase con el identificador, en estos casos, se copia, no quiero una copia profunda. Quiero que ambos controladores apunten al mismo objeto interno (como una ventana, por ejemplo). ¿Hay alguna manera de hacer que el compilador se dé cuenta de esto sin sobrecargar innecesariamente al constructor de copias y al operador de asignación, o deshabilitar la advertencia completamente con#pragma
? ¿Por qué me molesta en primer lugar cuando la Regla de los Tres no se aplica?