c++ - 从 lambda 返回对象/右值引用的首选形式

标签 c++ lambda c++11 rvalue

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

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

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

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

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

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

还是其他形式?

谢谢。

最佳答案

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

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

关于c++ - 从 lambda 返回对象/右值引用的首选形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8430274/

相关文章:

c++ - 包含字符串的结构的 Boost Interprocess vector 是否需要特殊分配器?

c++ - 最后写入 FILETIME 总是返回当前时间

c++ - C11/C++11 弱内存基准测试

python-3.x - 如何按姓氏对姓名进行排序

c++ - 区分用户类型和原语

c++ - 确定一个循环数是否几乎等于另一个

c# - 如何为此创建扩展方法/lambda 函数

c# - 如何在 c# 中使用 foreach 在列表中创建列表?

c++ - 使用可变参数模板的随机选择器函数——这可能吗?

c++11 - C++中使用auto进行数据类型转换