从方法链中使用的临时位置移动

时间:2018-07-06 19:08:00

标签: c++ move method-chaining temporary-objects

我正在尝试做类似的事情:

#include <vector>
#include <memory>

struct Bar
    {
    Bar& doThings()
        {return *this;}

    std::unique_ptr<int> m_content; // A non-copyable type
    };

struct Foo
    {
    Foo& append(Bar&& obj)
        {
        objects.push_back(std::move(obj));
        return *this;
        }

    std::vector<Bar> objects;
    };

int test()
    {
    Foo test;
    test.append(std::move(Bar{}.doThings())) //Ok
    // Not ok
      .append(Bar{}.doThings())
        ;
    }
  

错误:无法将类型Bar&&的右值引用绑定到类型Bar的左值

是否可以在没有显式std :: move的情况下进行这项工作?

尝试重载doThings无法解决问题:

  

错误: Bar&& Bar::doThings() &&无法重载

2 个答案:

答案 0 :(得分:4)

问题在于,当您从函数返回实例时,您没有右值。

但是,有一种方法可以根据对象的右值/左值来重载函数:

 Bar& doThings() & {return *this;}
 Bar doThings() && {return std::move(*this); }

答案 1 :(得分:3)

您可以添加doThings()的引用限定的重载:

struct Bar
    {
    Bar& doThings() &
        {return *this;}

    Bar&& doThings() &&
        {return std::move(*this);}

    std::unique_ptr<int> m_content; // A non-copyable type
    };