2015-03-18 4 views
4

Моя теория в том, что gcc имеет ошибку. Следующие компилирует в обоих лязгом и НКУ:Использование псевдонима для ссылки на анонимную структуру приводит к ошибке

using type = const struct {}&; 

Но теперь, когда я изменить его на ссылки RValue он компилирует с лязгом, но не с 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? Это проблема со стандартом или ошибкой?

ответ

2

Это выглядит как gcc ошибка, грамматика для безымянного класса рассматривается в разделе 9[класс] и мы имеем следующее:

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 

и следующий текст:

A class-specifier whose class-head omits the class-head-name defines an unnamed class.

так неназванный класс - это просто класс-спецификатор без имени и класса спецификатора является типа Спецификатор и раздел 7.1.3[dcl.typedef] говорит:

The typedef specifier shall not be combined in a declspecifier- seq with any other kind of specifier except a type-specifier

и не имеет каких-либо ограничений в отношении к безымянного класса и относится только к ним в этом пункте:

If the typedef declaration defines an unnamed class (or enum), the first typedef-name declared by the declaration to be that class type (or enum type) is used to denote the class type (or enum type) for linkage purposes only (3.5). [ Example:

typedef struct { } *ps, S; // S is the class name for linkage purposes 

—end example ]

Смежные вопросы