如何在一般的lambda中完美地转发`auto &&`?

xml*_*lmx 30 c++ lambda perfect-forwarding auto c++11

C++ 14支持通用lambda.但是,clang 3.4拒绝以下代码.

#include <utility>

void f(int);
void f(int&);

int main()
{
    [](auto&& v) { f(std::forward<auto>(v)); }(8); // error
}
Run Code Online (Sandbox Code Playgroud)

如何auto&&在一般的lambda中完美前进?

Kon*_*lph 32

auto不是一种类型所以我并不感到惊讶这不起作用.但你不能用decltype吗?

[](auto&& v) { f(std::forward<decltype(v)>(v)); }(8);
Run Code Online (Sandbox Code Playgroud)

Scott Meyers有更多细节.

  • @Aaron名称错误:每个长期存在的宏都应该被命名空间以避免名称冲突(即称为"MY_LIBRARY_NAME_FORWARD"),这当然会大大降低其可读性.更基本的是,宏根本不是必需的.我同意Yakk关于"DRY"的观点,但这里重复的是一个简单的标识符,而不是复杂的表达式. (4认同)
  • @Yakk但也AGUOM:避免无偿使用宏.;-) (3认同)
  • 如果有什么东西需要宏来干,请弄清楚如何改进语言! (3认同)
  • DRY - `#define FORWARD(x)std :: forward <decltype(x)>(x)` - ick. (2认同)