【问题标题】:C++ move only objects - what to return from assignment operatorC++ 只移动对象 - 从赋值运算符返回什么
【发布时间】:2014-10-09 14:39:37
【问题描述】:

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

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

【问题讨论】:

  • 在链中写std::move是可能的。
  • @LightnessRacesinOrbit 那就是……调用一个函数;)我不直接使用该值,我用它调用一个函数并使用该函数的返回
  • 我真的看不出问题。
  • @LightnessRacesinOrbit a = b = get_some_class() 不同于 a = std::move(b = get_some_class())
  • 而这一切的效用是......?

标签: c++


【解决方案1】:

您可能会争辩说,链接从来都不是一件好事,并且总是给 operator= 一个 void 返回类型。

但是,如果您不这样做,请省去“这是只移动类型吗?”的心理负担。在编写operator= 签名时,对所有类型都采用相同的方式。

编辑:换句话说,以通常的方式编写运算符比让代码的读者找出你不这样做的原因要少。

【讨论】:

    【解决方案2】:

    禁用复制时返回当前对象是否有意义或 void返回类型可以吗?

    对于operator= 是否应该在任何情况下返回分配的对象还是只返回void 的问题存在普遍的争论。许多人说允许链接会导致代码的可读性降低,并鼓励在一个语句/行中写入多个内容。

    我认为您的问题不那么哲学,但更注重实际。在这种情况下,请考虑某些链仍然有效:

    auto&& c = a = b;
    

    c 是一个引用(类型为class_name&),而不是一个对象,所以从operator= 返回的左值引用适当地初始化了c。显然,作为引用的函数参数也是如此,而且数量很多:

    template <typename T>
    void f(T&& t);
    
    // […]
    
    f(a = b);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-22
      • 1970-01-01
      • 2015-05-31
      • 2018-08-03
      • 2013-02-27
      • 2017-03-01
      相关资源
      最近更新 更多