我有一个具有这些特殊成员函数的结构:
struct MyStruct {
MyStruct(MyStruct& other) = delete;
MyStruct(MyStruct&& other) = default;
explicit MyStruct(int num) noexcept(false);
explicit MyStruct(MyOtherStructType&& other_type);
~MyStruct();
auto operator=(MyStruct&& other) noexcept(false) -> MyStruct&;
}
叮当整洁 说:
Class 'MyStruct' defines a non-default destructor, a copy constructor, a move
constructor and a move assignment operator but does not define a copy assignment
operator
由于
hicpp-special-member-functions/cppcoreguidelines-special-member-functions
lint,但是我认为我删除了复制构造函数?我错过了什么吗?是不是线错了?
所以它说我已经显式删除了复制构造函数,但没有删除复制运算符。这听起来就像有一个复制构造函数。
一旦您声明任何特殊成员函数,五法则就适用于所有其他特殊成员函数,而不仅仅是当您为其中一个函数提供自定义定义时。
删除复制构造函数时也应应用该规则的原因是,删除复制构造函数不会阻止复制赋值运算符的隐式声明。
但是,如果您显式删除了复制构造函数,那么您的类型很可能也不应该在赋值时具有默认的复制语义。五法则确保您不会忘记为复制赋值运算符声明正确的语义。
照现在的情况,写
MyStruct x(1);
MyStruct y = x;
格式不正确,但是
MyStruct x(1);
MyStruct y(2);
y = x;
将使用编译器生成的默认复制行为进行编译,如果您删除了复制构造函数,这可能对您的类型是错误的。