4

我的理论是 gcc 有一个错误。以下在 clang 和 gcc 中编译:

using type = const struct {}&;

但是现在当我将其更改为右值引用时,它会使用 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 中编译?这是标准的问题还是错误?

4

1 回答 1

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

和以下文字:

其类头省略类头名称的类说明符定义了一个未命名的类。

所以一个未命名的类只是一个没有名称的类说明符,而说明符是一个类型说明符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

—结束示例]

于 2015-03-19T02:54:36.687 回答