如何解决在std :: is_constant_evaluated时如何获取常量表达式?
让我们从示例(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
的原因。
问题:当且仅当
std::is_constant_evaluated
时,才可以将变量用作constexpr吗?如果可以,怎么办?
不,不是。因为为了将变量用作常量表达式,所以这是一个模板。 is_constant_evaluated
不能有条件地将您的函数转换为函数模板,而这并不是编译过程的工作方式。参见P0992。
不可能,但也不必要。
您可以static_assert
来代替throw
。由于您处于constexpr
上下文中,因此会出现编译时错误。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。