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,是的,我可以试着看它是否有效,但我想知道为什么。