gpt4 book ai didi

c++ - "int size = 10;"是否产生常量表达式?

转载 作者:IT老高 更新时间:2023-10-28 21:37:27 25 4
gpt4 key购买 nike

以下代码在 gcc 4.8 和 Clang 3.2 下编译:

int main()
{
int size = 10;
int arr[size];
}
C++ 标准的

8.3.4/1 规定数组的大小必须是一个整数常量表达式,而 size 似乎不是。这是两个编译器中的错误,还是我遗漏了什么?

最新的 VC++ CTP 拒绝带有这个有趣消息的代码:

error C2466: cannot allocate an array of constant size 0

有趣的部分是它似乎认为 size 为零。但至少它拒绝了代码。 gcc 和 Clang 不应该做同样的事情吗?

最佳答案

这是variable length arraysVLA,它是一个 C99 功能,但 gccclang支持它作为 C++ 的扩展,而 Visual Studio does not .所以 Visual Studio 在这种情况下遵守标准并且在技术上是正确的。并不是说扩展不好,Linux kernel depends on many gcc extensions ,因此它们在某些情况下很有用。

如果你添加 -pedantic 标志,gccclang 都会警告你,例如 gcc 说( see it live ):

warning: ISO C++ forbids variable length array 'arr' [-Wvla]
int arr[size];
^

使用 -pedantic-errors 标志会使这成为错误。您可以在这些文档中阅读更多关于扩展的信息 Language Standards Supported by GCCclangs Language Compatibility section .

更新

draft C++ standard5.19 常量表达式 段落 3 中介绍什么是 整数常量表达式 并说:

An integral constant expression is an expression of integral or unscoped enumeration type, implicitly converted to a prvalue, where the converted expression is a core constant expression. [...]

阅读本文并不能直观地看出所有可能性,但Boost's Coding Guidelines for Integral Constant Expressions做得很好。

在这种情况下,由于您使用 const 使用 literal 初始化 size,因此足以使其成为 整数常量表达式 (参见 [expr.const]p2.9.1 )并将代码恢复为标准C++:

const int size = 10;

使用 constexpr 也可以:

constexpr int size = 10;

阅读 Difference between constexpr and const 可能会有所帮助.

引用C99 draft standard8.3.4段落1的等效部分将是 6.7.5.2 Array declarators 段落 4 部分,它说(emphasis mine):

If the size is not present, the array type is an incomplete type. If the size is * instead of being an expression, the array type is a variable length array type of unspecified size, which can only be used in declarations with function prototype scope;124) such arrays are nonetheless complete types. If the size is an integer constant expression and the element type has a known constant size, the array type is not a variable length array type; otherwise, the array type is a variable length array type.

关于c++ - "int size = 10;"是否产生常量表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21273829/

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