lambda 函数/表达式是否支持 constexpr?
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
更新:从 C++17 开始,常量表达式中允许使用 lambda。
根据 [expr.const]/(2.6),目前 (C++14) 不允许在常量表达式中使用 Lambda,但它们一旦N4487 被接受(可以在工作草案中找到) N4582):
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):
来自 C++0x FDIS §7.1.5[dcl.constexpr]/1:
lambda 表达式不是这些东西,因此不能声明
constexpr
。From the C++0x FDIS §7.1.5[dcl.constexpr]/1:
A lambda expression is none of those things and thus may not be declared
constexpr
.C++17 之前 lambda 与
constexpr
不兼容。它们不能在常量表达式中使用。从 C++17 开始 lambda 是有意义的
constexpr
。提案N4487将被纳入C++17标准。在 他的网站上 Herb ISO C++ 委员会主席 Sutter 表示: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:FFWD 到 2018 年 :)
自 c++17 起
FFWD to year 2018 :)
Since c++17
我知道这是一个老问题,但没有人为此指定解决方法。解决方法是使用 constexpr 函子,如下所示:
这不是最佳选择,因为它将代码移离了使用的位置,但当您没有太多选项时,这是可行的。对于仍使用 c++14 编译的项目,我必须使用类似的东西。这个简单的案例已在 c++11 上进行了测试:https://godbolt.org/z/Gvxq19jsd
但是,如果您有 c++17 或更高版本,则使用所描述的:
是一个更好的选择。
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: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:
is a nicer option.