将lambda函数指定为默认参数

时间:2011-05-17 00:51:02

标签: c++ lambda c++11

如何将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)。

2 个答案:

答案 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
}
     

- 结束示例]