6

玩弄新的数组放置,我(偶然/错误地)想到了以下代码:

#include <new>

struct X{};

int main()
{
    char buf[256];
    std::size_t n = 10;
    X* p = new (buf) (X[n]); // incorrect way, parenthesis by mistake
    //X* p = new (buf) X[n]; // correct way
}

中的第三行main不正确,尽管它可以编译。不应该有任何括号。铿锵++吐出来

警告:当类型在括号中时,数组不能有动态大小

而 gcc6 输出

警告:ISO C++ 禁止变长数组 [-Wvla] X* p = new (buf) (X[n]);

警告:非常量数组的新长度必须在 type-id [-Wvla] X* p = new (buf) (X[n]) 周围不带括号的情况下指定;

然后在tree_to_uhwi 中的 tree.h:4044 处因内部编译器错误 (ICE)而崩溃。内部编译器错误仅出现在 gcc >= 6 中。

我的问题:标记为“不正确”的行是如何解析/解释的,为什么有这些括号是“错误的”?*

*对于ICE,无论如何我都会填写一个错误。

编辑 1我刚刚意识到 ICE/警告与用户定义的类型无关,因此观察到相同的行为int而不是struct X.

编辑 2 gcc6 错误在这里填充。在 gcc5 或更早的版本中没有出现 ICE(只有警告出现,这是正确的)。

4

1 回答 1

3

使用括号,要更新的类型来自type-id,在本例中为X[n]。这是一个可变长度数组,不是标准行为。没有括号,要更新的类型是一个new-type-id,一个X.

于 2016-09-24T02:36:55.440 回答