围绕放置数组的新运算符的括号

vso*_*tco 6 c++ gcc clang placement-new internal-compiler-error

玩数组的新位置,我出现(偶然/错误)使用以下代码:

#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
}
Run Code Online (Sandbox Code Playgroud)

第三行main是不正确的,虽然它编译.不应该有任何括号.clang ++吐出来

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

而gcc6输出

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

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

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

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

*对于ICE,无论如何我都会填写一个bug.

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

编辑2 gcc6错误填写在这里.ICE不会出现在gcc5或更早版本中(仅出现警告,这是正确的).

120*_*arm 3

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