【发布时间】:2015-07-17 10:46:17
【问题描述】:
如何在 C++14 中编写通用转发 lambda?
尝试#1
[](auto&& x) { return x; }
在函数体内,x 是一个左值,所以这不起作用。
尝试#2
[](auto&& x) { return std::forward<decltype(x)>(x); }
这会在 lambda 中正确转发引用,但它总是会返回 按值(除非编译器省略了副本)。
尝试#3
[](auto&& x) -> decltype(x) { return std::forward<decltype(x)>(x); }
这将返回与参数相同的类型(可能-> auto&& 也可以)并且似乎可以正常工作。
尝试#4
[](auto&& x) noexcept -> decltype(x) { return std::forward<decltype(x)>(x); }
添加noexcept 是否会使这个 lambda 更适用,从而严格优于 #3?
【问题讨论】:
-
Try 1 已经足够了。如果数据类型定义了移动构造函数/移动赋值,编译器将为您移动它
标签: c++ lambda c++14 perfect-forwarding