在lambda函数中使用auto

BЈо*_*вић 39 c++ lambda auto c++11

#include <vector>
#include <algorithm>

void foo( int )
{
}

int main()
{
  std::vector< int > v( { 1,2,3 } );

  std::for_each( v.begin(), v.end(), []( auto it ) { foo( it+5 ); } );
}
Run Code Online (Sandbox Code Playgroud)

编译时,上面的示例启动错误输出,如下所示:

h4.cpp: In function 'int main()':
h4.cpp:13:47: error: parameter declared 'auto'
h4.cpp: In lambda function:
h4.cpp:13:59: error: 'it' was not declared in this scope
Run Code Online (Sandbox Code Playgroud)

这是否意味着auto不应在lambda表达式中使用关键字?

这有效:

std::for_each( v.begin(), v.end(), []( int it ) { foo( it+5 ); } );
Run Code Online (Sandbox Code Playgroud)

为什么带有auto关键字的版本不起作用?

Jag*_*ath 67

auto关键字不能用作函数参数的类型.如果您不想在lambda函数中使用实际类型,那么您可以使用下面的代码.

 for_each(begin(v), end(v), [](decltype(*begin(v)) it ){
       foo( it + 5);         
 });
Run Code Online (Sandbox Code Playgroud)

  • 我们将在[C++ 14](http://en.wikipedia.org/wiki/C%2B%2B14#Generic_lambdas)中获得lambdas中的"auto"支持. (40认同)
  • 注意 `decltype` 中 `begin(v)` 之前的星号。您需要值类型而不是迭代器类型。(失败时的错误消息将是神秘的)。 (2认同)

Raz*_*aul 22

C++ 14允许使用auto声明lambda函数(Generic lambda函数)参数.

auto multiply = [](auto a, auto b) {return a*b;};
Run Code Online (Sandbox Code Playgroud)

有关详细信息:http://en.cppreference.com/w/cpp/language/lambda


Ker*_* SB 20

Herb Sutter在一次采访中对此进行了简要讨论.auto事实上,你对参数的要求与要求任何函数都可以声明的要求没有区别auto,如下所示:

auto add(auto a, auto b) -> decltype(a + b) { return a + b; }
Run Code Online (Sandbox Code Playgroud)

但请注意,这根本不是一个功能,而是一个模板功能,类似于:

template <typename S, typename T>
auto add(S a, T b) -> decltype(a + b) { return a + b; }
Run Code Online (Sandbox Code Playgroud)

因此,您基本上要求设施通过更改其参数将任何函数转换为模板.由于模板在C++类型系统中是一种非常不同的实体(考虑模板的所有特殊规则,如两阶段查找和演绎),这将是根本性的设计变更,具有不可预见的后果,当然不是很快就会成为标准.

  • 嗯,这与"为什么不是所有功能模板"的原因基本相同 - 它只是不适合语言的设计. (5认同)
  • 不,不要求或要求:)我只是想知道为什么它不起作用. (2认同)