C++ 当我只想禁用自定义赋值运算符=()时,它的签名是否重要?
我需要禁用复制分配操作符。这将有助于:C++ 当我只想禁用自定义赋值运算符=()时,它的签名是否重要?,c++,operator-overloading,assignment-operator,C++,Operator Overloading,Assignment Operator,我需要禁用复制分配操作符。这将有助于: A& operator=(const A&); 如果我没有为操作符=指定精确的参数,它会工作吗? 我的意思是这样的: void operator=(void); 返回值是正确的,我可以写任何我想要的,但是参数类型呢? 这将超越默认的运算符=< />代码>类?< p>从C++标准草案: 用户声明的复制赋值运算符X::operator=是类X的非静态非模板成员函数,只有一个参数类型为X,X&,常量X&,volatile X&或常量volat
A& operator=(const A&);
如果我没有为操作符=
指定精确的参数,它会工作吗?我的意思是这样的:
void operator=(void);
返回值是正确的,我可以写任何我想要的,但是参数类型呢?这将超越默认的<代码>运算符=< />代码>类?< p>从C++标准草案: 用户声明的复制赋值运算符
X::operator=
是类X
的非静态非模板成员函数,只有一个参数类型为X
,X&
,常量X&
,volatile X&
或常量volatile X&
我想这比任何其他测试或示例代码都好
请注意,类似的内容也适用于“移动分配”操作符,请参见:
用户声明的移动赋值运算符X::operator=是类X的非静态非模板成员函数,只有一个类型为X&&、const X&&、volatile X&&或const volatile X&&&的参数
这也证实了,正如您所猜测的,返回值类型并不重要。这是(§12.8 p.17)中用户声明的复制赋值运算符的精确定义: 用户声明的复制分配运算符
X::operator=
是非静态的
类X的非模板成员函数
键入X,X&,常量X&,volatile X&
或const volatile X&
注:
- 重载赋值运算符必须声明为只有一个 参数见13.5.3李>
- 一个类可以声明多种形式的复制赋值运算符李>
- 如果类X只有一个带有类型为X&的参数的复制赋值运算符,则不能将类型为const X的表达式赋值给类型为X的对象
struct X {
X();
X& operator=(X&);
};
const X cx;
X x;
void f() {
x = cx; // error: X::operator=(X&) cannot assign cx into x
}
另外,请使用从C++11标准中删除
现在可以将函数设置为默认或已删除
您现在可以直接写入要禁用复制的内容
class A {
A(const A&) = delete;
A& operator=(const A&) = delete; // Disallow copying
};
您还可以显式地通知编译器您想要类的默认副本。通过这种方式,您可以提供自定义默认构造函数,并且仍然可以从编译器获取其他编译器生成的方法的默认版本
class B {
B(const Y&) = default;
B& operator=(const B&) = default; // default copy
};
可以有不同类型的作业。编译器可能只生成复制分配和移动分配。如果没有复制/移动分配,则会生成它们。因此,如果您想禁用复制和/或移动赋值,参数类型确实很重要,尽管复制赋值可以使用不同的参数类型,因此有一定的灵活性。不过,返回类型并不重要
class A {
public:
void operator=() = delete; // not legal: assignment takes exactly one argument
void operator=(A) = delete; // OK: copy assignment disabled
void operator=(A&) = delete; // OK: copy assignment disabled
void operator=(A const&) = delete; // OK: copy assignment disabled
void operator=(A&&) = delete; // OK: move assignment disabled
};
还有一些变体将
const
替换为volatile
或const volatile
作为复制/移动分配。禁用复制分配时,也将禁用自动生成移动分配。如果禁用移动分配,我认为仍然会生成复制分配。如果您禁用任何不能复制或移动分配的内容,复制/移动分配仍会生成。“它会工作吗…”;你们试过了吗?作业必须有一个论点。@WhozCraig,是的,我可以试着看它是否有效,但我想知道为什么。