Понимание -Weffc++

Рассмотрим следующую программу:

#include <string>

struct S {
    S (){}

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

int main(){}

Это, при компиляции с -Weffc++на GCC 4.7.1, выдаст:

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

Обычно это не проблема, за исключением пары моментов в этом примере:

  1. Если я закомментирую любой конструктор, объявление указателя или объявление строки, предупреждение исчезнет.Это странно, потому что вы думаете, что одного указателя будет достаточно, но это не так. Кроме того, изменение строкового объявления на целочисленное объявление также приводит к его исчезновению, поэтому оно появляется только тогда, когда с ним есть строка (или, возможно, другие классы выбора ). Почему предупреждение исчезает при таких обстоятельствах?

  2. Часто это предупреждение появляется, когда все, что делает указатель, указывает на существующую переменную (, чаще всего поддерживаемую ОС ). Нет ни new, ни delete. Когда в этих случаях копируется класс с дескриптором, мне не нужна глубокая копия. Я хочу, чтобы оба дескриптора указывали на один и тот же внутренний объект (как окно, например ). Есть ли способ заставить компилятор реализовать это без ненужной перегрузки конструктора копирования и оператора присваивания или полного отключения предупреждения с помощью #pragma? Почему меня вообще беспокоят, когда правило трех даже не применяется?

14
задан Robᵩ 16 July 2012 в 01:20
поделиться