将lambda表达式传递给模板函数时的编译错误

时间:2013-09-27 03:13:08

标签: c++ c++11 lambda

为什么我不能让模板函数接受lambda表达式?

经过高低搜索 - 我认真地认为这可行,但是这个C ++代码;

template <typename F> int proc(const F& lam)
{
    return lam();
}
void caller()
{
    int i = 42;
    int j = proc( [&i]()->int{ return i/7; } );
}

我得到以下错误;

$ g++ x.cc
x.cc: In function ‘void caller()’:
x.cc:11:44: warning: lambda expressions only available with -std=c++0x or -std=gnu++0x [enabled by default]
x.cc:11:46: error: no matching function for call to ‘proc(caller()::<lambda()>)’
x.cc:11:46: note: candidate is:
x.cc:3:27: note: template<class F> int proc(const F&)

我使用的是g ++ 4.6.3和4.7.2

有人知道我要做什么来将lambda表达式作为参数传递给接收模板函数吗? - 我不想使用std :: function - 所以我唯一的选择就是创建一个丑陋的仿函数模式。

更新:试图声明参数const F&amp;林,但没有成功。 Update2:添加了对编译器的调用...

1 个答案:

答案 0 :(得分:3)

由于lambda不是左值,你需要通过const引用传递它:

template <typename F> int proc(const F& lam)

确保将-std = c ++ 11与g ++ 4.7.2或-std = c ++ 0x与g ++ 4.6.3一起使用。