我可以使用常量定义数组的长度,那么int d [b]为什么不起作用?


11
int a = 5;
const int b = a, c = 4;

int e[a];
int d[b];
int f[c];

的定义f[c]有效。
变量b也是恒定的int,但是编译器给我的错误“表达必须有一个恒定的值”为线int d[b]b和之间有什么区别c

Answers:


16

b和c有什么区别?

c有一个编译时间常数初始化器,而b没有。具有编译时间常数初始化程序的const对象本身就是一个编译时间常数值。

由于我可以使用常量定义一个长度的长度,所以为什么不这样做呢?

不仅任何常数都可以。const限定符表示运行时常量(即,该值可以在运行时确定,但在对象的整个生命周期中都不会改变)。只有编译时间常数值可以用作数组大小。


6

您正在使用非常数变量将值分配给常数。因此,该变量的值无法确定编译时间。我知道您没有改变a,但是编译器并不这样认为。


4

编译器诊断程序实际上应该是编译时可评估的常量表达式

由于b分配给它的原始对象不是constb不是可在编译时评估的常量表达式,所以编译将失败,因为标准C ++不支持可变长度数组。


1

“ const”仅表示变量在运行时不会更改,并不意味着可以在编译时推导出其值。

我猜您正在寻找的是“ constexpr”。也许您可以这样尝试:

constexpr int b = 4; // can't be assigned from a!
int d[b];

相反,由于某些历史原因,“ constexpr”表示“真实const”,而“ const”仅表示“不变var”。必须记住,c ++中的本机数组始终是固定长度的,如@Bathsheba所说。


您在说什么“其他语言”?
布赖恩

1
@Brian对不起,这无关紧要。我改变了答案。
里昂,

“没有真正的苏格兰人……”-让我不同意您的“ constexpr”,它表示“真实const”,而“ const”仅表示“不变var”语句。“ const”表示“ const”,“ constexpr”表示“ constexpr”-在c ++语言的上下文中,它们具有两种不同的含义和含义。“ const”表示“无法修改对象”,“ constexpr”表示“可以在编译时评估函数或变量的值”
CharonX

对不起,也许我说错了。英语不是我的母语。
里昂,

1

术语“常量”确实是模棱两可的,关键字const具有误导性。

const表示:“不允许在初始化后更改此对象的值”。它并不意味着“编译时间常数”。它的初始值仍然可以(通常是)仍然来自运行时源。

您需要一个数组边界的编译时常量。

有时可以有一个名为对象foo即编译时间常数,如果是const 它是从一个常量表达式初始化,像文字或constexpr东西。是这样的c;事实并非如此b

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.