c++ - 带有指针的 C++ -Weffc++ 警告
问题描述
我很难理解这个错误。我正在用-Weffc++
标志编译。
这个结构编译得很好。
struct A
{
A(){}
int * first = nullptr;
int second = 0;
};
这不是编译。
struct B
{
B(){}
int * first = nullptr;
std::vector<int> second{};
};
我正进入(状态:
prog.cc:14:8: warning: 'struct B' has pointer data members [-Weffc++]
14 | struct B
| ^
prog.cc:14:8: warning: but does not override 'B(const B&)' [-Weffc++]
prog.cc:14:8: warning: or 'operator=(const B&)' [-Weffc++]
但这又可以正常编译了。
struct C
{
int * first;
std::vector<int>& second;
};
为什么我们会收到关于指针的错误(它们在每个结构中)?为什么添加std::vector<int>
调用错误?我用最新的gcc 9.00
和C++2a
解决方案
这是一个警告,而不是错误。在拥有默认构造函数时,您有一些不倾向于正确使用的指针。如果您希望警告消失,请定义构造函数和赋值运算符。三/五/零法则
struct B {
int* first;
std::vector<int> second;
B() : first(nullptr), second{} {} // default
B(const B&) = delete; // copy ctor
B(B&&) = delete; // move ctor
B& operator=(const B&) = delete; // copy assignment
B& operator=(B&&) = delete; // move assignment
~B() { delete[] first; } // dtor
};
如果不这样做,移动和复制类的实例可能会导致默认实例化构造函数/赋值运算符产生不良影响,例如复制/移动无法复制/移动的资源。看看析构函数,想想如果让默认方法处理指针会发生什么。
推荐阅读
- sql - PostgreSQL,将数组嵌套到值中
- oracle - 关于连接的技术和语法疑问
- oracle-adf - 清除更改父属性时的依赖属性值
- python-3.x - 提取文件中单词的第一个匹配的 n 个字符
- python - 从实例数组中获取属性数组
- javascript - 在多计划条带订阅中更新单个计划 - WixCode
- ios - fastlane 以错误完成未经授权的访问
- node.js - 在 heroku 上获取对 node.js 中主目录的写访问权限以解决 ResumableUploadError
- generics - 在 Groovy 中实现通用接口
- django - 无法将自定义 AuthenticationForm 与 LoginView 一起使用