一个大小是const变量而非constexpr的数组可否声明?

6

这段C++代码是否正确?

const size_t tabsize = 50;
int tab[tabsize];

问题在于,我已经看到了许多关于这个问题的不同意见。甚至在##c++ IRC频道和编程论坛上,也有人提出截然不同的观点。
有些人说上述代码是正确的。
而其他人则认为它不是,认为应该像这样:
constexpr size_t tabsize = 50;
int tab[tabsize];

因为我已经被“C++专家”的相互矛盾的观点搞得很困惑了,所以我能否请你给出一个有合理依据的答案呢?非常感谢!


“code is correct.” 的意思是语法上正确还是语义上正确? - tchelidze
@tchelidze 我认为两者都可以? - user4385532
3
因为 Visual Studio 以其符合标准的表现而出名?(实际情况并非如此。) - T.C.
2
@tchelidze,一些编译器(甚至几乎所有编译器)接受代码并不意味着该代码符合C++标准。 - user4385532
1
[dcl.array]/1开始,它会引导您到[expr.const]/4,然后引导您到[expr.const]/5,最后引导您到[expr.const]/2。我太懒了,不想复制/粘贴文本并进行所有格式设置。 - T.C.
显示剩余5条评论
1个回答

17
在C++中,常量整数与其他常量类型的处理方式不同。如果它们用编译时常量表达式初始化,则可以在编译时表达式中使用它们。这是在C++开始时(当constexpr不存在时)完成的,以便数组大小可以是const int而不是像在C中强制使用#define: < p >(假设没有VLA扩展)< / p >
const int s = 10;
int a[s];          // OK in C++

const int s2 = read(); // assume `read` gets a value at run-time
int a2[s2];       // Not OK

int x = 10;
const int s3 = x;
int a3[s3];       // Not OK

所以答案是肯定的,如果它是由编译时常量表达式初始化的话,你可以使用一个const整数变量作为数组的大小。
这是来自另一个问题的我的回答。那个问题是关于intfloatconst以及constexpr的比较,所以不完全相同,但是这个答案在这里非常适用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接