C++语法是:T foo<U>; 有效的?

Jea*_*ier 31 c++

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

struct foo {
  int field<0, 1, int, 3>;
};
Run Code Online (Sandbox Code Playgroud)

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

int field<0, 1, int, 3>;
Run Code Online (Sandbox Code Playgroud)

我可以在field<>模板中放入我想要的任何内容(如果它甚至是模板?),例如field<0, 1, int, 3>编译和运行。但之后我无法访问它。

eer*_*ika 26

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

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

铿锵 AST 说:

`-CXXRecordDecl 0xdb6f20 <test.cpp:1:1, line:3:1> line:1:8 struct foo definition
  `-FieldDecl 0xdb7168 <line:2:3> col:7 'int'
Run Code Online (Sandbox Code Playgroud)

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'
Run Code Online (Sandbox Code Playgroud)

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

foo f{0}; // compiles in Clang
Run Code Online (Sandbox Code Playgroud)

第一个出现此错误的 Clang 版本似乎是 9:https ://gcc.godbolt.org/z/d386oz8v8


Dav*_*ing 9

如果没有 的声明field,这甚至不是有效的语法: can\xe2\x80\x99t 开始模板参数列表,并且在成员声明<中不允许使用表达式。(如果有合适的声明,它可能是具有两种类型且没有变量的无效声明。)绝对可以诊断,并且绝对是 Clang bug。

\n