我的理论是gcc有一个bug。以下是clang和gcc中的编译:
using type = const struct {}&;
但是现在当我将它改为rvalue引用时,它会用clang编译而不是用gcc编译:
using type = const struct {}&&;
// main.cpp:8:17: error: expected ';' after struct definition
// typedef struct {}&& type;
// ^
// main.cpp:8:17: error: missing type-name in typedef-declaration
// main.cpp:8:22: error: expected constructor, destructor, or type conversion before ';' token
// typedef const struct {}&& type;
// ^
它失败了typedef
版本以及相同的错误:
typedef const struct {}&& type;
为什么在gcc中无法编译?这是标准问题还是错误?
答案 0 :(得分:2)
这看起来像gcc
错误,未命名的类的语法在9
[class] 部分中介绍,我们有以下内容:
class-specifier:
class-head { member-specificationopt}
class-head:
class-key attribute-specifier-seqopt class-head-name class-virt-specifieropt base-clauseopt
class-key attribute-specifier-seqopt base-clauseopt
以及以下文字:
类 - 头部省略了class-head-name的类说明符定义了一个未命名的类。
所以未命名的类只是一个没有名称的类说明符而类说明符是类型说明符< / em>和部分7.1.3
[dcl.typedef] 说:
typedef说明符不得在declspecifier中组合 - seq与除类型说明符之外的任何其他类型的说明符
并且对未命名类没有任何限制,只在本段中引用它们:
如果typedef声明定义了一个未命名的类(或枚举),那么 声明声明为该类类型的第一个typedef-name (或枚举类型)用于表示类类型(或枚举类型) 仅限于联系目的(3.5)。 [例如:
typedef struct { } *ps, S; // S is the class name for linkage purposes
-end example]