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()抛出异常。
auto l = []()->bool { throw 42; };
constexpr bool t() { return l(); }GCC拒绝此函数的错误如下:
call to non-'constexpr' function '<lambda()>'但是Clang接受这个程序(直到函数t()用于常量计算),这意味着它认为l()是一个constexpr-function,https://gcc.godbolt.org/z/j1z7ee3Wv
它是Clang中的一个bug,还是这样的编译器行为也是可以接受的?
发布于 2021-10-18 13:00:00
当您实际尝试在需要常量表达式的上下文中使用t()的结果时,所有三个编译器都会发出错误。例如
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在评论中提到的,您的引用已经声明:
..。违反这颗子弹不需要诊断。
编译器不一定需要知道没有一组参数值允许函数返回常量表达式。另一方面,编译器可以很容易地验证给定的参数值,结果不是常量表达式。
https://stackoverflow.com/questions/69616430
复制相似问题