了解-Weffc ++(Understanding -Weffc++)

2019-06-26 07:31发布

考虑下面的程序:

#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. 很多时候,这个警告出现时,所有的指针做的是指向一个已存在的变量(通常由OS维护)。 有没有new ,并没有delete 。 当手柄类,在这些情况下,被复制,我不想深副本。 我想两个手柄以指向相同的内部对象(如窗口,例如)。 有什么办法使编译器实现这一点没有不必要的超载拷贝构造函数和赋值运算符,或完全禁用警告#pragma ? 为什么我在首位被打扰时三的规则并不适用于连?

Answer 1:

  1. 当你这样做,你有一个POD结构。 由于它不能有任何的构造函数, -Weffc++不打扰检查。

  2. 使用参考或shared_ptr对象或任何其他对象,包的指针。



Answer 2:

GCC的-Weffc++有几个问题,我从来没有使用它。 用于检查“问题”的代码非常简单,因此警告最终被过于生硬和无益的。

这个特别的警告是基于C ++有效和斯科特第一版的项目11改变了它(好了),在以后的版本。 的G ++代码不检查实际动态分配,指针构件只是存在。

看看我写了这样的警告在GCC的Bugzilla比较与第三版第一版的准则时:

项目11:定义与动态分配的内存类拷贝构造函数和赋值运算符。

通过14项替代:“仔细想想在资源管理类的复制行为” - 的建议是不太具体,但更为有用。 我不知道如何把它变成一个警告,但!



文章来源: Understanding -Weffc++