考虑以下代码:
static constexpr int make_const(const int i){
return i;
}
void t1(const int i)
{
constexpr int ii = make_const(i); // error occurs here (i is not a constant expression)
std::cout<<ii;
}
int main()
{
t1(12);
}
为什么我在 make_const 调用时出错?
更新
但这一个有效:
constexpr int t1(const int i)
{
return make_const(i);
}
但是,这不是:
template<int i>
constexpr bool do_something(){
return i;
}
constexpr int t1(const int i)
{
return do_something<make_const(i)>(); // error occurs here (i is not a constant expression)
}
原文由 tower120 发布,翻译遵循 CC BY-SA 4.0 许可协议
一个
constexpr
函数和一个constexpr
变量是相关的,但不同的东西。constexpr
变量是保证其值在编译时可用的变量。constexpr
函数是一个函数,如果使用constexpr
参数进行评估, 并且 在其执行期间表现“正确”,将在编译时评估。如果您将非
constexpr
int
传递给constexpr
函数,它不会神奇地使其在编译时进行评估。但是,它将被允许通过自身传递其输入参数的constexpr
(普通函数不能这样做)。constexpr
函数是文档和对它们的编写方式的限制以及对编译器的指令的混合。这背后的原因是允许在编译时和运行时评估相同的函数。如果传递运行时参数,则它是运行时函数。如果传递了
constexpr
参数,则可以在编译时对其进行评估(并且如果在某些上下文中使用)。请注意,
consteval
可能是您正在寻找的功能。但也许不是。您会收到错误,因为通过传入运行时值,您无法获得编译时值。
有办法解决这个问题。我最喜欢的是
std::variant
的std::integer_constant
;您可以选择在运行时处于活动状态,然后选择std::visit
以获得编译时间常数。缺点是这可以很容易地生成 大量 代码。(可能有错别字)。
现在你可以: