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)
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++类型系统中是一种非常不同的实体(考虑模板的所有特殊规则,如两阶段查找和演绎),这将是根本性的设计变更,具有不可预见的后果,当然不是很快就会成为标准.
归档时间: |
|
查看次数: |
24247 次 |
最近记录: |