玩弄新的数组放置,我(偶然/错误地)想到了以下代码:
#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(只有警告出现,这是正确的)。