使用数组的新位置,我出现(偶然/错误)使用以下代码:
#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
警告:当类型在括号中时,数组不能具有动态大小
而gcc6输出
警告:ISO C ++禁止变长数组[-Wvla] X * p = new(buf)(X [n]);
警告:必须在type-id [-Wvla]周围没有括号的情况下指定非常量数组的新长度 X * p = new(buf)(X [n]);
然后在 tree_to_uhwi中的crashes with an internal compiler error (ICE),在tree.h:4044 。内部编译器错误仅出现在gcc&gt; = 6.
中我的问题:标记线的确切位置&#34;错误&#34;解析/解释,为什么它&#34;错误&#34;有这些括号?*
*对于ICE,无论如何我都会填写一个bug。
编辑1 我刚刚意识到ICE /警告与用户定义的类型无关,因此int
而不是{{1}观察到相同的行为}。
编辑2 gcc6错误填充here。 ICE没有出现在gcc5或更早版本中(只显示警告,这是正确的。)
答案 0 :(得分:3)
使用括号,要新建的类型来自 type-id ,在本例中为X[n]
。这是一个可变长度数组,不是标准行为。如果没有括号,则要新建的类型是 new-type-id ,即X
的数组。