C++只移动对象-从赋值运算符返回什么

C++ move only objects - what to return from assignment operator

本文关键字:赋值运算符 返回 什么 移动 对象 C++      更新时间:2023-10-16

考虑移动赋值运算符的规范形式:

class_name & class_name :: operator= ( class_name && )

当复制被禁用时,由于返回的值是lvalue,并且从逻辑角度来看,不可能链接等于。我唯一能看到(也许你有其他示例)返回值可用的地方是在调用接受reference/const referenceclass_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);