康斯坦特还行,但不是康特克斯普尔?

const ok, but not constexpr?

本文关键字:康特克 康斯坦      更新时间:2023-10-16

使用constexpr指定的函数foo_constexpr我有如下所示的代码:

const auto x = foo_constexpr(y);
static_assert(x==0);

在什么情况下,当x声明更改为constexpr时,代码无法编译?(毕竟,x必须已经是用于static_assert的常量表达式。那是:

constexpr auto x = foo_constexpr(y);
static_assert(x==0);

通常,当执行foo_constexpr违反常量表达式的要求时,它可能无法编译。请记住,constexpr函数不是始终是常量表达式的函数。相反,它是一个函数,可以至少为一个输入生成常量表达式!就是这样。

因此,如果我们要编写这个完全合法的函数:

constexpr int foo_constexpr(int y) {
return y < 10 ? 2*y : std::rand();
}

然后我们将得到:

constexpr int y = 10;
const     auto x1 = foo_constexpr(y); // valid, execution time constant
constexpr auto x2 = foo_constexpr(y); // invalid, calls std::rand

但是,当然,如果x已经在常量表达式(例如静态断言(中使用,则更改为constexpr不会导致失败。