c++ - 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这篇文章使用标准中的引用来回答,我不明白。我将非常感谢使用更简单语言的答案。
解决方案
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 变量在使用前没有被修改过,那么将其指定为常量表达式也是不可行的,因为在大多数情况下无法证明,即使您已经找到了一种证明发生的情况要容易。
推荐阅读
- javascript - 如何将此代码转换为辅助函数?
- algorithm - 数组中 n 个元素的最大最小差
- flutter - 如何穿上身体:背景图片?
- javascript - 使用按钮添加文本时,ASP.NET 计算文本框中的文本
- kubernetes - Kubernetes 卷类型
- python - Python:使用 ProcessPoolExecutor 执行
- firebase - Firebase Cloud Messaging 请求 DeviceID 而不连接到 Firebase
- python - 使用 psycopg2 copy_expert 从 postgreSQL 表中更快地读取数据
- arrays - reactjs中如何将数据从类型{}转换为类型数组[]?
- angular - 全文搜索使用 Parse Dashboard API 匹配精确大小写