从lambda返回对象/ rvalue ref的首选形式

utn*_*tim 2 c++ lambda rvalue c++11

如果我有一个实现移动语义的类:

class BigObject
{
public:
    BigObject(something x = something()) { ... }
    BigObject(const BigObject& other) { ... }
    BigObject(BigObject&& other) { ... }
    BigObject& operator=(BigObject other) { ... }
    void swap(BigObject& other) { ... }
    // [...]
};


auto begin = std::begin(somethingSequence); // collection doesn't matter here
auto end = std::end(somethingSequence); // collection doesn't matter here

BigObjectOutputIterator dest; // collection doesn't matter here
Run Code Online (Sandbox Code Playgroud)

在lambda中返回BigObject的正确方法是什么?

std::transform(begin, end, dest, 
    [](something x) -> BigObject {return BigObject(x); });
Run Code Online (Sandbox Code Playgroud)

要么

std::transform(begin, end, dest, 
    [](something x) -> BigObject&& {return std::move(BigObject(x)); });
Run Code Online (Sandbox Code Playgroud)

要么

std::transform(begin, end, dest, 
    [](something x) -> BigObject {return std::move(BigObject(x)); });
Run Code Online (Sandbox Code Playgroud)

或其他形式?

谢谢.

Xeo*_*Xeo 6

第一种和第三种形式基本相同,因为它return BigObject(x);是一个右值,因此已经调用了移动构造函数.

然而,第二种形式调用未定义的行为,因为右值引用仍然只是一个引用,并且对超出范围的内容的引用仍然像以前一样糟糕.