gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:39:52 24 4
gpt4 key购买 nike

在尝试对数组进行 placement new 时,我(偶然/错误地)想到了以下代码:

#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 中。

我的问题:标记为“不正确”的行究竟是如何解析/解释的,为什么这些括号是“错误的”?*

*对于 ICE,无论如何我都会填写一个错误。

EDIT 1 我刚刚意识到 ICE/warning(s) 与用户定义的类型无关,所以 int 而不是 结构 X

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

最佳答案

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

关于c++ - 围绕数组放置新运算符的括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39671730/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com