我们应该在函数中用 constexpr 定义变量吗

问题描述

不知道在函数中用constexpr定义变量是否有意义。

void func() { static const int i = 1; }
void func2() { constexpr const int i = 1; }
函数中的

static const 将在第一次函数调用时初始化,函数中的 constexpr 怎么样?我知道 constexpr 指定对象在编译期间应该可用。那么这是否意味着 i 中的变量 func2 会在编译时被评估而 i 中的 func 不会?

解决方法

有一个重要的区别。

A static local variable 在第一次调用时被初始化,因此在后续调用中不再使用它的声明。特别是,静态局部变量的构造函数只被调用一次。 static const 是一个静态变量,也是一个常量:因此,它的值一旦在第一次调用时初始化,就不能再更改。

constexpr expression 是一个可以在编译时求值的表达式。因此,例如,constexpr 变量可以用作非类型模板参数。

通常,您不能使用简单的 static const 作为模板参数,因为即使它是一个常量,它的实际值也可能无法在编译时确定;例如:

void f(int x)
{
     static const i = x;
     std::array<int,i> a; // Compile error!
}

虽然,初始化为 constant expression 的整型变量仍然可以用作非类型模板参数。因此,在问题的代码中,i 的变量 func2 可以用作非类型模板参数。

,

有一些差异。初始化就是其中之一。让我们重命名变量,以便我们可以更轻松地讨论它们:

void func() { static const int i = 1; } //internal linkage
void func2() { constexpr const int a = 1; } //external linkage
  1. 初始化

在上面的代码中,only a 是一个编译时常量。它应在编译时初始化。这个想法是花时间在编译上并在运行时节省时间。但是,i 可以在编译时或运行时初始化。

至于您应该使用哪个?使用满足您需求的任何一种。