当我只想禁用自定义赋值运算符=()的签名时,它是否重要
Does signature of custom assignment operator=() matter when I just want to disable it?
我需要禁用复制赋值运算符。这将起作用:
A& operator=(const A&);
如果我不为operator=
指定确切的参数,它会起作用吗
我的意思是:
void operator=(void);
返回的值是正确的,我可以写任何我想写的东西,但参数类型呢
这会覆盖类的默认operator=
吗?
从C++标准草案的12.8p17开始:
用户声明的复制赋值运算符
X::operator=
是类X
的非静态非模板成员函数,仅具有一个类型为X
、X&
、const X&
、volatile X&
或const volatile X&
的参数。
我想这比任何其他测试或示例代码都能得到更好的回复。
请注意,类似的内容也适用于移动分配运算符,请参见12.8p19:
用户声明的移动赋值运算符X::operator=是类X的非静态非模板成员函数,只有一个类型为X&;,常量X&;,易失性X&;,或常量易失性X&;。
这些也证实了,正如您所猜测的,返回值类型无关紧要。
可以有不同类型的赋值。编译器可能只生成复制赋值和移动赋值 也有将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
的变体,这些变体符合复制/移动分配的条件。当您禁用复制分配时,移动分配的自动生成也将被禁用。如果禁用移动分配,我认为仍然会生成复制分配。如果禁用任何不能作为复制或移动分配的内容,则仍会生成复制/移动分配。
这是当前标准中用户声明的副本分配运算符的确切定义(§12.8,第17页):
用户声明的复制赋值运算符
X::operator=
是非静态的CCD_ 14的非模板成员函数类型CCD_ 15或CCD_。
备注:
- 重载赋值运算符必须声明为只有一个参数见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标准中删除。
现在,您可以将函数设置为Defaulted或Deleted。
现在,您可以直接写入要禁用复制的内容。
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
};
- 初始值设定项列表是否只接受使用相同类型的值初始化变量?
- 我只想在Android 4.4中使用C++11库
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 程序检查字符串是否只包含 1 和 0?
- 我只想获得高质量的功能点
- cuda 和 opencv:我只想要与原始图片相同的图片
- 我只想从文本文件中删除一个特定值或行
- 在循环中声明的对象是否只构造一次
- 为什么有时人们更喜欢Strtoll而不是Strtol,即使他们只想将字符串转换为INT32
- 当我只想禁用自定义赋值运算符=()的签名时,它是否重要
- 我试图证明一个给定的树是一个二进制搜索树.我将输入一个二叉树,我只想让函数返回true
- C++中的getline是否只采用字符串类型
- 如果我只想要架构良好的工作区,但不一定是分开的编译,如何在C++中组织头/代码文件
- 如何知道小部件是否只接受数字字符
- 我是否只需要基类中的虚拟
- 如何检查两个 std::vector 是否只包含相同的元素?
- Qt GUI-只想在值更改时读取.txt文件
- 当一个进程崩溃时,我怎么能压制所有的错误对话框(我只想让它安静地崩溃)
- 如果我只想在模板中专门研究一种方法,我该怎么做
- 指针是否只保存指向其他变量的地址