如何将lambda指定为默认参数?我想这样做:
int foo(int i, std::function<int(int)> f = [](int x) -> int { return x / 2; })
{
return f(i);
}
但我的编译器(Mac OS X上的g ++ 4.6)抱怨:
error: local variable 'x' may not appear in this context
修改: 实际上,这是一个编译器错误。上面的代码适用于最新版本的gcc(4.7-20120225)。
答案 0 :(得分:27)
您可以使用重载:
int foo(int i)
{
return foo(i, [](int x) -> int { return x / 2; });
}
int foo(int i, std::function<int(int)> f)
{
return f(i);
}
答案 1 :(得分:8)
这似乎是gcc中的一个错误;只要没有捕获任何内容,该标准就允许在默认参数中使用lambda表达式。
以下似乎是FDIS在默认参数中所说的关于lambdas的所有内容,因此默认情况下应允许除此处禁止使用的任何其他用途。
C ++ 11 FDIS 5.1.2 / 13
一个lambda表达式出现在 默认参数不得含蓄 或明确捕获任何实体。
[例如:
void f2() { int i = 1; void g1(int = ([i]{ return i; })()); // ill-formed void g2(int = ([i]{ return 0; })()); // ill-formed void g3(int = ([=]{ return i; })()); // ill-formed void g4(int = ([=]{ return 0; })()); // OK void g5(int = ([]{ return sizeof i; })()); // OK }
- 结束示例]