gpt4 book ai didi

c++ - new 表达式中详细类型说明符的条件表达式解析错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:07:19 26 4
gpt4 key购买 nike

考虑以下 C++ 代码:

struct A {};
struct A* b = (1 == 1) ? new struct A : new struct A;

MSVC 接受这一点,但 GCC 和 Clang 不接受。 我想了解根据标准哪个是正确的,以及为什么。

Clang 给出的错误是:

test.cpp:2:37: error: redefinition of 'A'
struct A* b = (1 == 1) ? new struct A : new struct A;
^
test.cpp:1:8: note: previous definition is here
struct A {};
^
test.cpp:2:37: error: '(anonymous struct at test.cpp:2:37)' cannot be defined in a type specifier
struct A* b = (1 == 1) ? new struct A : new struct A;
^
test.cpp:2:41: error: expected class name
struct A* b = (1 == 1) ? new struct A : new struct A;
^
test.cpp:2:53: error: expected '{' after base class list
struct A* b = (1 == 1) ? new struct A : new struct A;
^
test.cpp:2:53: error: expected ':'
struct A* b = (1 == 1) ? new struct A : new struct A;
^
:
test.cpp:2:24: note: to match this '?'
struct A* b = (1 == 1) ? new struct A : new struct A;
^
test.cpp:2:53: error: expected expression
struct A* b = (1 == 1) ? new struct A : new struct A;
^

这向我暗示 clang 正在尝试将标记 struct A : 解析为 class-specifier,冒号引入 base-clause,然后在解析失败时退出。

但是,我完全不明白为什么它会尝试解析一个class-specifier。查看 latest draft standardnew-expression 的语法,它使用 new-type-id 语法产生式,它使用 type-specifier-seq,它使用 type-specifier。但是,class-specifier 不是 type-specifier 的替代方案之一 - 它只是作为 defining-type 的替代方案出现-说明符。另一方面,elaborated-type-specifier type-specifier 的备选方案之一,并且会在此处为我们提供预期的解析。

最佳答案

虽然我没有权威的答案,但我有一个有根据的猜测可以提供。

defining-type-specifier 产品最近才添加到标准中:如果您查看 draft from late 2015 ,它不存在,并且在引入之前,type-specifier 确实class-specifier作为它的替代品之一。

引入 defining-type-specifier 产生式的 changeDR 2141 的解析,它涉及 - 等等 - 涉及 new-expression 的歧义elaborated-type-specifier(尽管它没有具体提及条件表达式)。

Clang 针对 DR 2141 的 implementation status 当前列为“未知”。

所以,我有根据的猜测是:

  • Clang 和 GCC 尚未执行 DR 2141 的决议
    • 更新:我发现了一个关于这个主题的 GCC bug,并提交了一个 Clang bug
  • 因此,他们试图根据旧的type-specifier 产生式解析一个new-type-id,其中包括一个class-specifier 作为其替代方案之一。

有一件事我仍然有点困惑:即使尝试解析一个类说明符失败,为什么不回溯并尝试解析一个详细类型说明符 而不是?据推测,这种事情对于消除 class-specifierelaborated-type-specifier 的歧义是必要的,以便在允许的上下文中开始。

关于c++ - new 表达式中详细类型说明符的条件表达式解析错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46803238/

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