围绕数组放置新运算符的括号
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
.
的数组
尝试使用数组的新位置,我想出了(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
.