将 lambda 函数指定为默认参数

Specifying a lambda function as default argument

本文关键字:默认 参数 lambda 函数      更新时间:2023-10-16

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

您可以使用重载:

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);
}

这似乎是 gcc 中的一个错误; 该标准允许默认参数中的 lambda 表达式,只要没有捕获任何内容。

以下内容似乎是 FDIS 关于默认参数中 lambda 的所有内容,因此此处禁止的任何用途都应该默认允许。

C++11 FDIS 5.1.2/13

出现在 默认参数不应隐含 或显式捕获任何实体。

[ 示例:

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
}

— 结束示例 ]