用于删除复制/移动分配运算符的有效签名
Valid signature to delete copy/move assignment operator
使用以下签名删除复制或移动赋值运算符(可能仅删除)是否有效(请注意void
作为结果类型)?
struct A
{
A() = default;
void operator = (const A &) = delete;
void operator = (A &) = delete;
void operator = (A &&) = delete;
};
G++/clang++接受上面的代码(实际上可以被认为是缩短)。是否对分配运算符的签名有更严格的要求才能明确删除它们?
继承的情况下是否有任何干扰?
来自 [class.copy.assign]:
用户声明的复制赋值运算符
X::operator=
是类X
的非静态非模板成员函数,只有一个类型为X
、X&
、const X&
、volatile X&
或const volatile X&
的参数。
同样,对于移动:
用户声明的移动赋值运算符
X::operator=
是类X
的非静态非模板成员函数,只有一个类型为X&&
、const X&&
、volatile X&&
或const volatile X&&
的参数。
此处对返回类型没有限制。仅在参数类型上。编译器生成的这些版本返回X&
,但这绝不强制您做同样的事情。
如果仍然要删除分配运算符,则返回void
就可以了。请注意,您不需要同时删除复制和移动分配运算符。如果删除复制分配,则不会隐式生成移动。
的情况下是否有任何干扰?
不。隐式生成的赋值运算符将被定义为已删除(并将返回X&
,尽管这是正交的)。如果你声明一个,那么这当然取决于你做任何你想做的事。
这是完全有效的。如果你的类不需要/想要/不能使用这些函数,那么显式并删除它们是正确的做法(即使返回类型不参与重载解析,你可能希望让它们正确只是为了减少混淆)。
相关文章:
- 为什么比较运算符如此快速
- 自定义先决条件对移动分配运算符有效吗
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 我的运算符重载是否有效<<(流插入)左操作数不是 ostream
- 自定义类型转换运算符在转发引用上调用时不起作用(当对象按值传递时有效)
- 重载"+="运算符:c+=a_times_b 有效,但 c+=a*b 不起作用?
- 用于删除复制/移动分配运算符的有效签名
- 没有类减法运算符重载,但仍然有效
- C++ 运算符重载 += 有效,但<<不起作用
- “A a = A()”有效吗?下面调用了哪些运算符/方法
- 为什么在三元运算符的分支之间返回 lambda 对某些 lambda 有效?
- 三向比较运算符是否始终有效
- 如何有效地使用结构定义,包括来自另一个源文件的运算符
- 转换运算符在这种情况下有效吗
- ("!")运算符不是在任何地方都有效吗?
- 为什么重载运算符<<有时有效,但有时不起作用
- 后递增和预递增运算符是否比普通"+"运算符更有效?
- 实现用于<<的有界字符串格式运算符的有效方法?
- C++中的有效向量运算符/对临时对象的引用
- 为什么C++ 'new'运算符的这种实现有效?