C++只移动对象-从赋值运算符返回什么
C++ move only objects - what to return from assignment operator
考虑移动赋值运算符的规范形式:
class_name & class_name :: operator= ( class_name && )
当复制被禁用时,由于返回的值是lvalue
,并且从逻辑角度来看,不可能链接等于。我唯一能看到(也许你有其他示例)返回值可用的地方是在调用接受reference/const reference
到class_name
:的函数时
void foo(class_name&){}
void bar(const class_name&){}
void use_foo_bar()
{
some_class a;
foo(a = get_some_class());
bar(a = get_some_class());
}
但我认为这是一种糟糕的编程风格(个人观点),我不想在代码库中看到它。
当复制被禁用或void
返回类型正常时,返回当前对象有意义吗
您可能会认为链接从来都不是一件好事,并且总是给operator=
一个void
返回类型。
但是,如果你不这样做,那么在编写operator=
签名时,就不用担心"这是一种只移动的类型吗?",并对所有类型都采用相同的方式。
编辑:换言之,用通常的方式编写运算符比让代码的读者弄清楚你为什么不这样做工作量要小。
当复制被禁用或
void
返回类型可以吗?
关于operator=
在任何情况下都应该返回所分配的对象还是仅返回void
的问题,存在着普遍的争论。许多人说,允许链接会导致代码可读性降低,并鼓励在一个语句/行中写入多个内容。
我认为你的问题不那么哲学,但更注重实际。在这种情况下,考虑一些链仍然有效:
auto&& c = a = b;
c
是引用(类型为class_name&
),而不是对象,因此从operator=
返回的左值引用适当地初始化c
。很明显,作为参考的函数参数也是如此,它们有很多:
template <typename T>
void f(T&& t);
// […]
f(a = b);
相关文章:
- 使用赋值运算符重载从类中返回jobject
- 为什么我的类工作正常,即使在返回垃圾值作为赋值运算符和空复制构造函数的返回之后
- 赋值运算符的返回值可以作为参考吗?
- 为什么类的赋值运算符的返回类型通常是非常量(而不是常量)引用?
- 赋值运算符重载 c++ 的返回值
- 在对类对象的赋值进行链接时获取垃圾值,使用按值返回类对象的赋值运算符重载
- 尽管返回了引用,但无法链接重载的赋值运算符
- 为什么赋值运算符必须返回任何内容
- 重载运算符 = 返回 void 是否不可能成为复制赋值运算符
- 通过赋值运算符返回字符数组
- 是 c++ 中的赋值运算符返回右值或左值
- 返回赋值运算符的类型
- 为什么在赋值运算符重载中返回引用
- 返回 C++ 中重载赋值运算符的类型
- C++只移动对象-从赋值运算符返回什么
- 按值返回调用复制构造函数或复制赋值运算符
- C++赋值运算符默认返回
- C++返回一个具有常量成员变量的对象 -- 隐式删除赋值运算符
- 返回包装类中赋值运算符的类型
- 赋值运算符在不应该返回"empty"实例时返回?