考虑以下程序:

#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++]

通常没有问题,除了此示例中的几件事:
  • 如果我注释掉任何构造函数,指针声明或字符串声明,则警告消失。这很奇怪,因为您认为仅指针就足够了,但事实并非如此。此外,将字符串声明更改为整数声明也会使其消失,因此仅在带有字符串(或其他选择类)的情况下才会出现。为什么在这种情况下警告会消失?
  • 通常,当所有指针正在执行的操作都指向一个现有变量(通常由OS维护)时,会出现此警告。没有new,也没有delete。在这种情况下,当复制带有句柄的类时,我不需要深层复制。我希望两个句柄都指向同一个内部对象(例如,一个窗口)。有什么方法可以使编译器实现此目标,而又不必不必要地重载复制构造函数和赋值运算符,或者使用#pragma完全禁用警告?当“三个规则”甚至不适用时,为什么我会被打扰?
  • 最佳答案

    GCC的-Weffc++有几个问题,我从未使用过。检查“问题”的代码非常简单,因此警告最终变得过于直率和无益。

    该特定警告基于Effective C++第一版的条款11,Scott在以后的版本中对其进行了更改(更好)。 G++代码不检查实际的动态分配,仅检查指针成员的存在。

    将第一版和第三版中的指南进行比较时,请参阅GCC's bugzilla中关于此警告的内容:



    替换为第14项:“请仔细考虑以下行为:
    资源管理类”-建议不那么具体,但更有用。我
    不确定如何将其变成警告!

    07-27 13:38