根据 [expr.prim.lambda] ,以下代码似乎没问题:
#include<functional>
typedef int(*func1)(int);
typedef std::function<int(int)> func2;
int function(int)
{
return 0;
}
template<typename F = func1>
int function1(F f = function)
{
return 0;
}
template<typename F = func2>
int function2(F f = function)
{
return 0;
}
template<typename F = func1>
int function3(F f = [](int i){return 0;})
{
return 0;
}
template<typename F = func2>
int function4(F f = [](int i){return 0;})
{
return 0;
}
然而,gcc(4.8.1)抱怨function3
和function4
并显示错误
用于封闭类的模板参数的默认参数 '__lambda'
有人可以解释这个错误吗?
答案 0 :(得分:2)
我可以建议一种解决方法吗?
删除function3
(和function4
)的默认模板参数:
template<typename F>
int function3(F f = [](int i){return 0;})
{
return 0;
}
您可以这样称呼它:
function3<func1>();
但我想你希望能够像这样打电话:
function3();
不,不是吗?然后,创建function3
的另一个重载,它是一个函数而不是模板函数:
int function3(func1 f = [](int i){return 0;})
{
return function3<func1>(f);
}