指定 lambda 函数作为默认参数

发布于 2024-11-08 00:13:11 字数 373 浏览 0 评论 0原文

如何将 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) 上正常工作。

How do I assign a lambda as default argument? I would like to do this:

int foo(int i, std::function<int(int)> f = [](int x) -> int { return x / 2; })
{
    return f(i);
}

but my compiler (g++ 4.6 on Mac OS X) complains:

error: local variable 'x' may not appear in this context

EDIT:
Indeed, this was a compiler bug. The above code works fine with a recent version of gcc (4.7-20120225).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

撩心不撩汉 2024-11-15 00:13:11

您可以使用重载:

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

You could use overloading:

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);
}
花想c 2024-11-15 00:13:11

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

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

C++11 FDIS 5.1.2/13

出现在 a 中的 lambda 表达式
默认参数不应隐式
或显式捕获任何实体。

[示例:

void f2() {
    整数 i = 1;
    void g1(int = ([i]{ 返回 i; })()); // 格式错误
    无效 g2(int = ([i]{ 返回 0; })()); // 格式错误
    void g3(int = ([=]{ 返回 i; })()); // 格式错误
    无效 g4(int = ([=]{ 返回 0; })()); // 好的
    void g5(int = ([]{ return sizeof i; })()); // 好的
}

—结束示例]

This seems to be a bug in gcc; the standard permits lambda expressions in default parameters as long as nothing is captured.

The following seems to be everything the FDIS says about lambdas in default parameters, so any use other than what is forbidden here ought to be permitted by default.

C++11 FDIS 5.1.2/13

A lambda-expression appearing in a
default argument shall not implicitly
or explicitly capture any entity.

[ Example:

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
}

— end example ]

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文