C++ 用于删除复制/移动分配运算符的有效签名

C++ 用于删除复制/移动分配运算符的有效签名,c++,c++11,language-lawyer,assignment-operator,C++,C++11,Language Lawyer,Assignment Operator,使用以下签名(注意void作为结果类型)删除复制或移动赋值运算符(可能是独占的)是否有效 G++/clang++接受上述代码(实际上它可能被认为是缩短代码)。是否对赋值运算符的签名有更严格的要求,以使其明确删除 在继承的情况下是否有任何干扰?这是完全有效的。如果您的类不需要/想要/无法使用这些函数,那么将其显式化并删除它们是正确的做法(即使返回类型不参与重载解析,您也可能希望将其更正以减少混淆)。来自: 用户声明的复制分配运算符X​::​运算符=是类X的非静态非模板成员函数,只有一个类型为X、X

使用以下签名(注意
void
作为结果类型)删除复制或移动赋值运算符(可能是独占的)是否有效

G++/clang++接受上述代码(实际上它可能被认为是缩短代码)。是否对赋值运算符的签名有更严格的要求,以使其明确删除


在继承的情况下是否有任何干扰?

这是完全有效的。如果您的类不需要/想要/无法使用这些函数,那么将其显式化并删除它们是正确的做法(即使返回类型不参与重载解析,您也可能希望将其更正以减少混淆)。

来自:

用户声明的复制分配运算符
X​::​运算符=
是类
X
的非静态非模板成员函数,只有一个类型为
X
X&
const X&
volatile X&
const volatile X&
的参数

同样,对于:

用户声明的移动分配运算符
X​::​运算符=
是类
X
的非静态非模板成员函数,只有一个类型为
X&
const X&
volatile X&
const volatile X&
的参数

这里对返回类型没有限制。仅在参数类型上。编译器生成的这些文件的版本,但这并没有要求您做同样的事情

如果仍要删除赋值运算符,则返回
void
即可。请注意,不需要同时删除“复制”和“移动”赋值运算符。如果删除副本分配,则会删除

在继承的情况下是否有任何干扰


不会。隐式生成的赋值运算符将是(并且将返回
X&
,尽管这是正交的)。如果你申报一个,那当然取决于你想做什么

我特别感兴趣的是如何正确使用
void
作为结果类型。@Orient:我记得将它们私有化有一个怪癖,但是
void
返回类型绝对可以。返回类型不参与重载解析。如果您有用户声明的复制构造函数,编译器将不会创建默认的移动构造函数。很确定这同样适用于赋值。这些是关键的5种方法@user4581301在这里可能是独占的,这意味着在实际实现中可能会出现任何组合,甚至是提到的唯一运算符。@此处不相关。问题在于运算符的签名,而不是惯用语。[啊!太慢了]如果要禁用复制,该链接显示了需要删除的4个复制操作的正确签名。您可以不设置返回类型,但这不是一种好的做法,在某些情况下,您可能会收到编译器警告。注意,当您定义函数而不是删除它们时,返回类型
void
甚至是合法的。
struct A
{
    A() = default;
    void operator = (const A &) = delete;
    void operator = (A &) = delete;
    void operator = (A &&) = delete;
};