Compréhension -Weffc++

Considérons le programme suivant:

#include <string>

struct S {
    S (){}

private:
    void *ptr = nullptr;
    std::string str = "";
};

int main(){}

Ce, lorsqu'il est compilé avec -Weffc++ sur GCC 4.7.1, va cracher:

avertissement: 'struct S' a pointeur de données des membres de la [-Weffc++] 
avertissement: mais ne remplace pas S '(const S&)' [-Weffc++] 
avertissement: ou 'operator=(const S&)' [-Weffc++] 

Qui ne pose pas de problème normalement, sauf pour un couple de choses avec cet exemple:

  1. Si je commente peu importe le constructeur, le pointeur de la déclaration, ou de la chaîne de déclaration, l'avertissement disparaît. C'est étrange parce que vous pensez que le pointeur serait suffisant, mais il n'est pas. En outre, la modification de la chaîne de déclaration d'un entier de la déclaration de causes à la disparition, alors qu'il vient seulement quand il y a une chaîne de caractères (ou probablement d'autres choix de classes). Pourquoi ne l'avertissement disparaît dans ces circonstances?
  2. Souvent cet avertissement s'affiche lorsque tous le pointeur est en train de faire est de pointage d'une variable existante (le plus souvent maintenu par le système d'exploitation). Il n'y a pas new, et pas de delete. Lorsque la classe avec la poignée, dans ces cas, est copié, je ne veux pas d'une copie en profondeur. Je veux les deux poignées pour pointer vers le même objet interne (comme une fenêtre, par exemple). Est-il possible de faire le compilateur de réaliser cela sans se surcharger inutilement le constructeur de copie et l'opérateur d'affectation, ou de la désactivation de l'avertissement complètement avec #pragma? Pourquoi suis-je dérangé, en premier lieu, lorsque la Règle de Trois n'a même pas l'appliquer?

OriginalL'auteur chris | 2012-07-16