Использование псевдонима для ссылки на анонимную структуру приводит к ошибке

Моя теория заключается в том, что в gcc есть ошибка. Следующее компилируется как в 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? Это проблема со стандартом или ошибка?


person template boy    schedule 18.03.2015    source источник


Ответы (1)


Это похоже на ошибку 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

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

Спецификатор класса, заголовок класса которого опускает имя заголовка класса, определяет безымянный класс.

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

Спецификатор typedef не должен объединяться в declspecifier-seq с каким-либо другим спецификатором, кроме спецификатора типа.

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

Если объявление typedef определяет безымянный класс (или перечисление), первое имя typedef, объявленное объявлением как тип этого класса (или тип перечисления), используется для обозначения типа класса (или типа перечисления) только для целей компоновки (3.5). ). [ Пример:

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

— конец примера]

person Shafik Yaghmour    schedule 19.03.2015