无法传递lambda表达式作为参考

时间:2014-08-25 12:45:59

标签: c++ c++11 visual-studio-2013

我有这个代码示例:

#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;该模板函数中的参数,但我理解有趣。

1 个答案:

答案 0 :(得分:1)

这很有效。它对你有帮助吗?

auto l = [](){ std::cout << "ok2" << std::endl; };
[&l]()
{
   bar(l);
}();