【问题标题】:Is the C++ syntax: T foo<U>; valid?是 C++ 语法:T foo<U>;有效的?
【发布时间】:2022-03-03 01:06:48
【问题描述】:

以下代码使用 Clang 编译和运行(在 13、14 和当前 git head 上测试),但不使用 GCC。

struct foo {
  int field<0, 1, int, 3>;
};

但我不明白它在声明什么:这个字段是什么?

int field<0, 1, int, 3>;

我可以在field&lt;&gt; 模板中放入我想要的任何东西(如果它甚至是一个模板?),例如field&lt;0, 1, int, 3&gt; 编译并运行。但之后我无法访问它。

【问题讨论】:

  • @463035818_is_not_a_number 我在帖子里说过这是和clang有关的
  • 很明显看起来像是clang中的一个错误!也可能是 NDR?
  • 如果您还没有报告,请将此报告为错误。
  • Bug 已向 clang 报告并已修复,感谢 @cor3ntin 的疯狂效率:github.com/llvm/llvm-project/issues/54151

标签: c++


【解决方案1】:

假设field 不是已声明的模板,则程序格式错误。

但我不明白它在声明什么:这个字段是什么?

Clang AST 说:

`-CXXRecordDecl 0xdb6f20 <test.cpp:1:1, line:3:1> line:1:8 struct foo definition
  `-FieldDecl 0xdb7168 <line:2:3> col:7 'int'

Clang AST 用于带有int field; 的程序:

`-CXXRecordDecl 0x168af90 <test2.cpp:1:1, line:3:1> line:1:8 struct foo definition
  `-FieldDecl 0x168b150 <line:2:3, col:7> col:7 field 'int'

因此,看起来 Clang 认为正在声明 int 字段,但该字段的名称为空。能够初始化这个“未命名”字段似乎证实了这一点:

foo f{0}; // compiles in Clang

第一个有这个bug的Clang版本似乎是9:https://gcc.godbolt.org/z/d386oz8v8

【讨论】:

    【解决方案2】:

    如果没有field 的声明,这甚至是无效的语法&lt; 不能开始模板参数列表,并且表达式不允许在 成员声明。 (使用合适的声明,它可能是具有两种类型且没有变量的无效声明。)绝对可以诊断,而且绝对是 Clang 错误。

    【讨论】:

      猜你喜欢
      • 2019-01-26
      • 2012-10-15
      • 1970-01-01
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      • 2015-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多