2014-10-09 55 views
3

考虑移动赋值运算符的this规范形式:c + +只移动物体 - 如何从赋值运算符返回

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返回类型正常时,返回当前对象是否有意义?

+0

如果你写'的std ::链内move'这是可能的。 – 2014-10-09 14:46:27

+0

@LightnessRacesinOrbit这就是...调用函数;)我不直接使用该值,我使用它调用函数并使用该函数的返回 – Felics 2014-10-09 14:49:56

+1

我真的没有看到问题。 – 2014-10-09 14:59:32

回答

2

你可能会认为链接永远不是好东西,总是给operator=一个void返回类型。

但是,如果你不这样做,请让自己的精神开销“这是一种移动型?”在编写operator=签名时,对所有类型执行相同的操作。

编辑:换句话说,以通常的方式编写运算符的工作量要少于编码读者的工作量,以便找出原因。

1

复制被禁用时返回当前对象是否有意义或 void返回类型是否正常?

关于operator=应该在任何情况下是否返回指定的对象或只是void的问题存在一般性争论。许多人说,允许链接导致可读性较差的代码,并鼓励在一条语句/行中写入不止一个东西。

我假设你的问题不那么哲学,但更实际的定位。在这种情况下,考虑到某些链仍然工作:

auto&& c = a = b; 

c是基准(用class_name&型),而不是一个对象,所以从operator=返回的左值参考适当地初始化c。这显然也是对那些引用函数参数的情况下,有相当多的人:

template <typename T> 
void f(T&& t); 

// […] 

f(a = b);