从方法链中使用的临时移动
Move from temporary used in method chaining
我正在尝试做类似的事情:
#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())
;
}
error: cannot bind rvalue reference of type Bar&&
to lvalue of type Bar
是否可以在没有显式 std::move 的情况下完成这项工作?
尝试重载 doThings 无法解决问题:
error: Bar&& Bar::doThings() &&
cannot be overloaded
问题是,当您 return 来自函数的实例时,您没有右值。
不过,有一种方法可以根据对象的rvalue/lvalue重载函数:
Bar& doThings() & {return *this;}
Bar doThings() && {return std::move(*this); }
您可以添加 doThings()
:
的引用限定重载
struct Bar
{
Bar& doThings() &
{return *this;}
Bar&& doThings() &&
{return std::move(*this);}
std::unique_ptr<int> m_content; // A non-copyable type
};
我正在尝试做类似的事情:
#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())
;
}
error: cannot bind rvalue reference of type
Bar&&
to lvalue of typeBar
是否可以在没有显式 std::move 的情况下完成这项工作?
尝试重载 doThings 无法解决问题:
error:
Bar&& Bar::doThings() &&
cannot be overloaded
问题是,当您 return 来自函数的实例时,您没有右值。
不过,有一种方法可以根据对象的rvalue/lvalue重载函数:
Bar& doThings() & {return *this;}
Bar doThings() && {return std::move(*this); }
您可以添加 doThings()
:
struct Bar
{
Bar& doThings() &
{return *this;}
Bar&& doThings() &&
{return std::move(*this);}
std::unique_ptr<int> m_content; // A non-copyable type
};