考虑以下程序:
#include <string>
struct S {
S (){}
private:
void *ptr = nullptr;
std::string str = "";
};
int main(){}
这-Weffc++
在 GCC 4.7.1 上编译时会输出:
警告:“结构 S”具有指针数据成员 [-Weffc++] 警告:但不覆盖 'S(const S&)' [-Weffc++] 警告:或 'operator=(const S&)' [-Weffc++]
这通常没问题,除了这个例子中的几件事:
如果我注释掉任何构造函数、指针声明或字符串声明,警告就会消失。这很奇怪,因为您认为仅指针就足够了,但事实并非如此。此外,将字符串声明更改为整数声明也会导致它消失,因此它仅在存在字符串(或可能其他选择类)时出现。为什么在这种情况下警告会消失?
当所有指针都指向现有变量(通常由操作系统维护)时,通常会出现此警告。没有
new
,也没有delete
。在这些情况下,当复制带有句柄的类时,我不想要深拷贝。我希望两个句柄都指向同一个内部对象(例如窗口)。有没有办法让编译器实现这一点,而无需不必要地重载复制构造函数和赋值运算符,或者完全禁用警告#pragma
?当三法则甚至不适用时,为什么我首先会受到困扰?