lambda 函数/表达式是否支持 constexpr?

发布于 2024-11-16 12:27:01 字数 270 浏览 4 评论 0原文

struct Test
{
  static const int value = []() -> int { return 0; } ();
};

使用 gcc-4.6,我得到类似错误:函数需要为 constexpr 的信息。我尝试了在不同位置放置 constexpr 的多种组合,但没有成功。

lambda 函数是否也支持 constexpr(无论是否指定返回类型)?正确的语法是什么?

有什么解决办法吗?

struct Test
{
  static const int value = []() -> int { return 0; } ();
};

With gcc-4.6 I get something like, error: function needs to be constexpr. I have tried multiple combinations of putting constexpr at various places, but no luck.

Is constexpr supported for lambda functions as well (irrespective of return type specified or not) ? What is the correct syntax ?

Any work around possible ?

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

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

发布评论

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

评论(5

终遇你 2024-11-23 12:27:01

更新:从 C++17 开始,常量表达式中允许使用 lambda。


根据 [expr.const]/(2.6),目前 (C++14) 不允许在常量表达式中使用 Lambda,但它们一旦N4487 被接受(可以在工作草案中找到) N4582):

该提案建议在常量中允许使用 lambda 表达式
表达式,删除现有的限制。作者提出
某些lambda表达式以及对某些闭包的操作
允许对象出现在常量表达式中。在这样做的过程中,
我们还建议将闭包类型视为文字类型,如果
它的每个数据成员的类型都是文字类型;并且,如果
lambda 声明符中省略了 constexpr 说明符,即
如果满足,则生成的函数调用运算符为 constexpr
constexpr 函数的要求(类似于
隐式定义已经发生的 constexpr 推断
构造函数和赋值运算符函数)。

Update: As of C++17, lambdas are permitted in constant expressions.


Lambdas are currently (C++14) not allowed in constant expressions as per [expr.const]/(2.6), but they will once N4487 is accepted (which can be found in the working draft N4582):

This proposal suggests allowing lambda-expressions in constant
expressions, removing an existing restriction. The authors propose
that certain lambda-expressions and operations on certain closure
objects be allowed to appear within constant expressions. In doing so,
we also propose that a closure type be considered a literal type if
the type of each of its data-members is a literal type; and, that if
the constexpr specifier is omitted within the lambda-declarator, that
the generated function call operator be constexpr if it would satisfy
the requirements of a constexpr function (similar to the
constexpr inference that already occurs for implicitly defined
constructors and the assignment operator functions).

好多鱼好多余 2024-11-23 12:27:01

来自 C++0x FDIS §7.1.5[dcl.constexpr]/1:

constexpr 说明符仅适用于变量的定义、函数或函数模板的声明或文字类型的静态数据成员的声明。

lambda 表达式不是这些东西,因此不能声明 constexpr

From the C++0x FDIS §7.1.5[dcl.constexpr]/1:

The constexpr specifier shall be applied only to the definition of a variable, the declaration of a function or function template, or the declaration of a static data member of a literal type.

A lambda expression is none of those things and thus may not be declared constexpr.

韵柒 2024-11-23 12:27:01

C++17 之前 lambda 与 constexpr 不兼容。它们不能在常量表达式中使用。

从 C++17 开始 lambda 是有意义的 constexpr 。提案N4487将被纳入C++17标准。在 他的网站上 Herb ISO C++ 委员会主席 Sutter 表示:

现在允许在 constexpr 函数中使用 Lambda

Prior to C++17 lambdas are not compatible with constexpr. They cannot be used inside constant expressions.

Starting with C++17 lambdas are constexpr where it makes sense. The proposal N4487 will be put into the C++17 standard. On his website Herb Sutter, chair of the ISO C++ committee, stated the following:

Lambdas are now allowed inside constexpr functions.

伴我心暖 2024-11-23 12:27:01

FFWD 到 2018 年 :)

auto my_const_expression_lambda = []()
  constexpr -> bool
{
   return true ;
}

自 c++17 起

FFWD to year 2018 :)

auto my_const_expression_lambda = []()
  constexpr -> bool
{
   return true ;
}

Since c++17

客…行舟 2024-11-23 12:27:01

我知道这是一个老问题,但没有人为此指定解决方法。解决方法是使用 constexpr 函子,如下所示:

struct functor
{
    constexpr int operator()() { return 0; }
};

struct Test
{
  static const int value = functor{}();
};

这不是最佳选择,因为它将代码移离了使用的位置,但当您没有太多选项时,这是可行的。对于仍使用 c++14 编译的项目,我必须使用类似的东西。这个简单的案例已在 c++11 上进行了测试:https://godbolt.org/z/Gvxq19jsd

但是,如果您有 c++17 或更高版本,则使用所描述的:

struct Test
{
  static constexpr int value = []() constexpr { return 0; }();
};

是一个更好的选择。

I know that this is an old question, but no one specified a workaround for this. The workaround is to use a constexpr functor like so:

struct functor
{
    constexpr int operator()() { return 0; }
};

struct Test
{
  static const int value = functor{}();
};

Not optimal as it moves the code away from where it's used, but when you don't have many options, this is doable. I had to use something similar for a project still compiling with c++14. This simple case has been tested on c++11 here: https://godbolt.org/z/Gvxq19jsd

However, if you have c++17 or higher, using the described:

struct Test
{
  static constexpr int value = []() constexpr { return 0; }();
};

is a nicer option.

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