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

Parenthesis around placement new operator for arrays

尝试使用数组的新位置,我想出了(chance/mistake)以下代码:

#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 中的第三行不正确,尽管它可以编译。不应该有任何括号。 clang++ spits out

warning: when type is in parentheses, array cannot have dynamic size

而 gcc6 输出

warning: ISO C++ forbids variable length array [-Wvla] X* p = new (buf) (X[n]);

warning: non-constant array new length must be specified without parentheses around the type-id [-Wvla] X* p = new (buf) (X[n]);

然后 crashes with an internal compiler error (ICE)tree_to_uhwi,在 tree.h:4044。内部编译器错误仅出现在 gcc >= 6 中。

我的问题: 标记为 "incorrect" parsed/interpreted 的那一行到底是怎么回事,为什么 "wrong" 有那些括号?*

*对于ICE,反正我会补个bug

EDIT 1 我刚刚意识到 ICE/warning(s) 与用户定义类型无关,因此观察到 int 而不是 struct X.

编辑 2 gcc6 错误已填充 here。 ICE在gcc5及更早的版本中没有出现(只有warning出现,是正确的)

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

的数组