gpt4 book ai didi

c++ - const(但不是 constexpr)用作内置数组大小

转载 作者:太空狗 更新时间:2023-10-29 20:33:01 27 4
gpt4 key购买 nike

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

// 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?

附言This使用我不理解的标准引号发布答案。我将非常感谢使用更简单语言的答案。

最佳答案

n is not a constant expression type!

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

为了使其名称成为常量表达式,不必声明变量 constexprconstexpr 对变量的作用是强制执行编译时常量。示例:

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 变量必须用常量表达式初始化。


then why does the following not compile:

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

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

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

关于c++ - const(但不是 constexpr)用作内置数组大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57995973/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com