首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++中,从不计算为常量表达式的lambda()可以是`‘吗?

在C++中,从不计算为常量表达式的lambda()可以是`‘吗?
EN

Stack Overflow用户
提问于 2021-10-18 12:52:29
回答 1查看 119关注 0票数 3

Lambda的operator()是隐式的constexpr,根据https://en.cppreference.com/w/cpp/language/lambda

当这个说明符(constexpr)不存在时,函数调用操作符或任何给定的操作符模板专门化都将是constexpr,如果它恰好满足了constexpr函数的所有要求。

以及根据constexpr-function对https://en.cppreference.com/w/cpp/language/constexpr的要求

至少存在一组参数值,因此函数的调用可以是核心常量表达式的求值子表达式(对于构造函数,在常量初始化程序中使用就足够了)(因为C++14)。违反这颗子弹不需要诊断。

在下一个示例中,函数t()总是通过调用lambda l()抛出异常。

代码语言:javascript
复制
auto l = []()->bool { throw 42; };
constexpr bool t() { return l(); }

GCC拒绝此函数的错误如下:

代码语言:javascript
复制
call to non-'constexpr' function '<lambda()>'

但是Clang接受这个程序(直到函数t()用于常量计算),这意味着它认为l()是一个constexpr-function,https://gcc.godbolt.org/z/j1z7ee3Wv

它是Clang中的一个bug,还是这样的编译器行为也是可以接受的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-18 13:00:00

当您实际尝试在需要常量表达式的上下文中使用t()的结果时,所有三个编译器都会发出错误。例如

代码语言:javascript
复制
auto l = []()->bool { throw 42; };
constexpr bool t() { return l(); }

template <bool x>
struct dummy {};

int main() {
   dummy< t() > d;   // error: t() is not a constant expression
}

正如NathanOliver在评论中提到的,您的引用已经声明:

..。违反这颗子弹不需要诊断。

编译器不一定需要知道没有一组参数值允许函数返回常量表达式。另一方面,编译器可以很容易地验证给定的参数值,结果不是常量表达式。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69616430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档