数组

时间:2016-09-24 01:47:56

标签: 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
}

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或更早版本中(只显示警告,这是正确的。)

1 个答案:

答案 0 :(得分:3)

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