Zrozumienie -Weffc ++

Rozważmy następujący program:

#include <string>

struct S {
    S (){}

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

int main(){}

To po skompilowaniu z-Weffc++ w GCC 4.7.1 wypluje:

warning: 'struct S' has pointer data members [-Weffc++]
warning:   but does not override 'S(const S&)' [-Weffc++]
warning:   or 'operator=(const S&)' [-Weffc++]

To normalny problem, z wyjątkiem kilku rzeczy z tego przykładu:

Jeśli skomentuję dowolny konstruktor, deklarację wskaźnika lub deklarację ciągu, ostrzeżenie zniknie. To dziwne, ponieważ można by pomyśleć, że sam wskaźnik wystarczy, ale tak nie jest. Co więcej, zmiana deklaracji łańcuchowej na deklarację całkowitą powoduje jej zniknięcie, więc pojawia się tylko wtedy, gdy jest z nią łańcuch (lub prawdopodobnie inne klasy wyboru). Dlaczego ostrzeżenie znika w takich okolicznościach?

Często to ostrzeżenie pojawia się, gdy wszystko, co robi wskaźnik, wskazuje na istniejącą zmienną (najczęściej obsługiwaną przez system operacyjny). Nie manew, i niedelete. Kiedy klasa z uchwytem w tych przypadkach jest kopiowana, nie chcę głębokiej kopii. Chcę, aby oba uchwyty wskazywały ten sam obiekt wewnętrzny (na przykład okno). Czy jest jakiś sposób, aby kompilator zdał sobie z tego sprawę bez niepotrzebnego przeciążania konstruktora kopii i operatora przypisania lub całkowitego wyłączania ostrzeżenia za pomocą#pragma? Dlaczego przejmuję się przede wszystkim, gdy zasada trzech nie ma zastosowania?

questionAnswers(2)

yourAnswerToTheQuestion