考虑下面的程序:
#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++]
这是没有问题的,通常,除了这个例子有两件事情:
如果我注释掉的任何构造函数,指针声明或字符串声明,警告消失。 这是奇怪,因为你会觉得孤单的指针就足够了,但事实并非如此。 此外,改变字符串声明为一个整数声明导致其消失一样,所以它只出现在当有一个字符串(或其他可能选择类)与它。 为什么警告在这种情况下消失?
很多时候,这个警告出现时,所有的指针做的是指向一个已存在的变量(通常由OS维护)。 有没有
new
,并没有delete
。 当手柄类,在这些情况下,被复制,我不想深副本。 我想两个手柄以指向相同的内部对象(如窗口,例如)。 有什么办法使编译器实现这一点没有不必要的超载拷贝构造函数和赋值运算符,或完全禁用警告#pragma
? 为什么我在首位被打扰时三的规则并不适用于连?