考虑以下程序:
#include <string>
struct S {
S (){}
private:
void *ptr = nullptr;
std::string str = "";
};
int main(){}
在GCC 4.7.1上使用
-Weffc++
编译时,这将吐出:警告:“结构S”具有指针数据成员[-Weffc++]
警告:但不会覆盖'S(const S&)'[-Weffc++]
警告:或'operator =(const S&)'[-Weffc++]
通常没有问题,除了此示例中的几件事:
new
,也没有delete
。在这种情况下,当复制带有句柄的类时,我不需要深层复制。我希望两个句柄都指向同一个内部对象(例如,一个窗口)。有什么方法可以使编译器实现此目标,而又不必不必要地重载复制构造函数和赋值运算符,或者使用#pragma
完全禁用警告?当“三个规则”甚至不适用时,为什么我会被打扰? 最佳答案
GCC的-Weffc++
有几个问题,我从未使用过。检查“问题”的代码非常简单,因此警告最终变得过于直率和无益。
该特定警告基于Effective C++第一版的条款11,Scott在以后的版本中对其进行了更改(更好)。 G++代码不检查实际的动态分配,仅检查指针成员的存在。
将第一版和第三版中的指南进行比较时,请参阅GCC's bugzilla中关于此警告的内容:
替换为第14项:“请仔细考虑以下行为:
资源管理类”-建议不那么具体,但更有用。我
不确定如何将其变成警告!