c++ - std::is_constant_evaluate 时如何获取常量表达式?
问题描述
让我们从示例(godbolt)开始:
constexpr int len(int v) {
if (std::is_constant_evaluated()) {
// static_assert(v > 0); // ERR: 'v' is not a constant expression
return v;
} else {
return 0;
}
}
using A = std::array<int, len(3)>;
问题是,static_assert
不会编译(gcc / clang 最新的 10.x 版本)。显然,v
没有意识到是constexpr
当std::is_constant_evaluated
返回true
。但显然,通过使用len
,它实际上是。
问题:是否可以constexpr
当且仅当使用变量std::is_constant_evaluated
?如果是这样,怎么做?
解决方案
显然,
v
没有意识到是constexpr
当std::is_constant_evaluated
返回true
。但显然,通过使用len
,它实际上是。
不,实际上不是。
函数参数不是常量表达式。无论您是否正在进行持续评估,都没有关系。您不能v
在任何上下文中用作常量表达式。static_assert
需要一个常量表达式——这就是为什么你不能使用v
.
问题:是否可以将变量用作 constexpr 当且仅当
std::is_constant_evaluated
?如果是这样,怎么做?
不它不是。因为为了将变量用作常量表达式,嗯,那是一个模板。并且is_constant_evaluated
不能有条件地将你的函数变成函数模板,这不是编译过程可以工作的方式。见P0992。