我们应该在函数中用 constexpr 定义变量吗
Should we define variable with constexpr in a function
不知道在函数中用constexpr定义变量是否有意义
void func() { static const int i = 1; }
void func2() { constexpr const int i = 1; }
函数中的 static const
会在第一次函数调用时初始化,那么函数中的 constexpr
呢?我知道 constexpr
指定对象在编译期间应该可用。那么这是否意味着 func2
中的变量 i
将在编译时求值,而 func
中的 i
则不会?
有一个重要的区别。
A static local variable 在第一次调用时被初始化,因此在后续调用中不再使用它的声明。特别是,静态局部变量的构造函数只被调用一次。
static const
是一个静态变量,也是一个常量:因此,它的值一旦在第一次调用时初始化,就不能再更改。
A constexpr
expression 是一个可以在编译时 求值的表达式 。因此,例如,constexpr
变量可以用作非类型模板参数。
一般来说,你不能使用一个简单的 static const
作为模板参数,因为即使它是一个 const,它的实际值也可能无法在编译时确定;例如:
void f(int x)
{
static const i = x;
std::array<int, i> a; // Compile error!
}
不过,初始化为 constant expression 的整型变量仍然可以用作非类型模板参数。因此,在问题的代码中,func2
的变量 i
可以用作非类型模板参数。
有些不同。初始化是其中之一。让我们重命名变量,以便我们可以更轻松地讨论它们:
void func() { static const int i = 1; } //internal linkage
void func2() { constexpr const int a = 1; } //external linkage
- 初始化
在上面的代码中,只有a
是一个编译时常量。它应在编译时初始化。想法是把时间花在编译上,节省时间 运行 次。但是,i
可能会在编译时或 运行 时被初始化。
至于你应该使用哪个?使用满足您需求的那个。
不知道在函数中用constexpr定义变量是否有意义
void func() { static const int i = 1; }
void func2() { constexpr const int i = 1; }
函数中的 static const
会在第一次函数调用时初始化,那么函数中的 constexpr
呢?我知道 constexpr
指定对象在编译期间应该可用。那么这是否意味着 func2
中的变量 i
将在编译时求值,而 func
中的 i
则不会?
有一个重要的区别。
A static local variable 在第一次调用时被初始化,因此在后续调用中不再使用它的声明。特别是,静态局部变量的构造函数只被调用一次。
static const
是一个静态变量,也是一个常量:因此,它的值一旦在第一次调用时初始化,就不能再更改。
A constexpr
expression 是一个可以在编译时 求值的表达式 。因此,例如,constexpr
变量可以用作非类型模板参数。
一般来说,你不能使用一个简单的 static const
作为模板参数,因为即使它是一个 const,它的实际值也可能无法在编译时确定;例如:
void f(int x)
{
static const i = x;
std::array<int, i> a; // Compile error!
}
不过,初始化为 constant expression 的整型变量仍然可以用作非类型模板参数。因此,在问题的代码中,func2
的变量 i
可以用作非类型模板参数。
有些不同。初始化是其中之一。让我们重命名变量,以便我们可以更轻松地讨论它们:
void func() { static const int i = 1; } //internal linkage
void func2() { constexpr const int a = 1; } //external linkage
- 初始化
在上面的代码中,只有a
是一个编译时常量。它应在编译时初始化。想法是把时间花在编译上,节省时间 运行 次。但是,i
可能会在编译时或 运行 时被初始化。
至于你应该使用哪个?使用满足您需求的那个。