我有这个代码示例:
#include <iostream>
void
foo( int & value )
{
value += 5;
}
template< class T >
void
foo( T value )
{
value();
}
template < class T >
void bar( T & val )
{
foo( val );
}
int main()
{
int i = 0;
bar( i );
std::cout << i << std::endl;
// prints: 5
bar( [](){ std::cout << "ok1" << std::endl; } );
// prints: ok1
[]()
{
bar(
[](){ std::cout << "ok2" << std::endl; } );
}();
// error:
/*
test.cpp(36) : error C2664: 'void bar<void(__cdecl *)(void)>(T &)' : cannot conv
ert argument 1 from 'void (__cdecl *)(void)' to 'void (__cdecl *&)(void)'
with
[
T=void (__cdecl *)(void)
]
*/
}
有人可以解释为什么第一次(&#34; ok1&#34;)lambda转换成功,但是在嵌套的情况下(&#34; ok2&#34;)它&#34;无法转换&#34; ?
P.S。当我使用&#34;通用参考&#34;该模板函数中的参数,但我理解有趣。
答案 0 :(得分:1)
这很有效。它对你有帮助吗?
auto l = [](){ std::cout << "ok2" << std::endl; };
[&l]()
{
bar(l);
}();