从lambda返回对象/右值ref的首选形式
Prefered form for returning an object/rvalue ref, from a lambda
如果我有一个实现move语义的类:
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);
是右值,因此已经调用了move构造函数。
第一种形式很好。作为一般规则,never, ever返回右值引用。第三种形式不需要移动,因为BigObject(x)
已经是右值了。
相关文章:
- 为什么istream不支持右值提取
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 为左值和右值的包装器实现C++范围
- 为什么可以将左值传递给"std::async",即使它引用了右值
- 有没有办法一次声明相同类型的多个对象,并通过一个表达式立即使用相同的右值初始化它们?
- 将输入参数作为右值引用传递?
- 传递空初始值设定项列表时使用右值和左值引用候选项的重载解析
- 右值引用转换后的地址更改
- 移动构造函数和右值引用
- 从 BubbleSort* 类型的右值初始化 'AssortedSorter&' 类型的非常量引用无效"
- 模板允许左值与右值引用绑定
- 无法将右值引用函数与 GCC 匹配
- 初始化右值引用成员
- 是否可以使用右值初始化数据成员?
- 如何在模板中转发右值和左值引用
- [expr.ref]/2 中的左值到右值转换
- 是否有支持右值的 ref 指针版本
- std::将右值ref转发到lambda
- 从lambda返回对象/右值ref的首选形式
- 右值ref的生命周期