gpt4 book ai didi

c++ - 理解-Weffc++

转载 作者:IT老高 更新时间:2023-10-28 21:39:33 27 4
gpt4 key购买 nike

考虑以下程序:

#include <string>

struct S {
S (){}

private:
void *ptr = nullptr;
std::string str = "";
};

int main(){}

当在 GCC 4.7.1 上使用 -Weffc++ 编译时,会吐出:

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. 当所有指针都指向一个现有变量(通常由操作系统维护)时,通常会出现此警告。没有new,也没有delete。在这些情况下,当复制带有句柄的类时,我不想要深拷贝。我希望两个句柄都指向同一个内部对象(例如窗口)。有没有办法让编译器实现这一点,而无需不必要地重载复制构造函数和赋值运算符,或者使用 #pragma 完全禁用警告?为什么我一开始就在三法则都不适用的情况下受到困扰?

最佳答案

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

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

查看我在 GCC's bugzilla 中写的关于此警告的内容在比较第一版和第三版的指南时:

Item 11: Define a copy constructor and an assignment operator for classes with dynamically allocated memory.

替换为第 14 条:“仔细考虑复制行为 资源管理类”——建议不那么具体,但更有用。我 不知道如何把它变成一个警告!

关于c++ - 理解-Weffc++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11496942/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com