首页 > 解决方案 > const(但不是 constexpr)用作内置数组大小

问题描述

我了解内置数组的大小必须是常量表达式:

// Code 1
constexpr int n = 5;
double arr[n];

我不明白为什么以下编译:

// Code 2
const int n = 5;
double arr[n]; // n is not a constant expression type!

此外,如果编译器足够聪明,可以看到n初始化为 5,那么为什么以下内容无法编译:

// Code 3
int n = 5;
double arr[n]; // n is initialized with 5, so how is this different from Code 2?

PS这篇文章使用标准中的引用来回答,我不明白。我将非常感谢使用更简单语言的答案。

标签: c++

解决方案


n 不是常量表达式类型!

没有常量表达式类型这样的东西。n在那个例子中是一个表达式,它实际上是一个常量表达式。这就是为什么它可以用作数组大小。

constexpr没有必要为了使其名称成为常量表达式而声明变量。对变量所做的是constexpr强制编译时常量。例子:

int a = 42;

尽管 42 是一个常数表达式,但a不是;它的值可能会在运行时改变。

const int b = 42;

b是一个常数表达式。它的值在编译时是已知的

const int c = rand();

rand()不是一个常量表达式,所以c也不是。它的值在运行时确定,但在初始化后可能不会改变。

constexpr int d = 42;

d是一个常量表达式,就像b.

constexpr int f = rand();

不编译,因为 constexpr 变量必须用常量表达式初始化。


那么为什么以下内容无法编译:

因为语言规则不允许。的值n不是编译时间常数。非常量变量的值可以在运行时改变。

该语言不能有某个值在运行时不变的规则,那么它就是一个常量表达式。这对程序员没有任何用处,因为他们不能假设哪个编译器能够证明哪个变量的常量。

语言必须准确指定表达式为常量的情况。如果非 const 变量在使用前没有被修改过,那么将其指定为常量表达式也是不可行的,因为在大多数情况下无法证明,即使您已经找到了一种证明发生的情况要容易。


推荐阅读