使用别名引用匿名结构会导致错误

时间:2015-03-18 22:35:08

标签: c++ c++11 gcc using-declaration

我的理论是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中无法编译?这是标准问题还是错误?

1 个答案:

答案 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]