typedef-name как базовый класс: незаконен, но широко допускается

В первом абзаце [class.derived] говорится о спецификаторах базового класса:

Если найденное имя не является именем класса, программа неправильно сформирована.

Однако простой тест показывает, что Comeau и g++ -ansi -pedantic оба принимают typedef-name в качестве основы. Простой grep -r '[^:]: mpl' над заголовками Boost показывает, что популярная библиотека часто использует такое поведение.

Отклонял ли когда-нибудь компилятор typedef класса в базовом спецификаторе? GCC даже проверяет, что тип базового класса не const, что уточняет нестандартную функциональность.

Есть ли обходной путь? Единственное, что я могу придумать, это заменить typedef шаблоном псевдонима C++11. Шаблонное объявление-псевдоним объявляет имя-шаблона, которое затем может стать именем класса… Я думаю. Для этого может потребоваться фиктивный параметр для объявления псевдонима.

Возможно, Стандарт следует скорректировать, чтобы он соответствовал единодушному поведению компиляторов. ДР есть?


person Potatoswatter    schedule 28.04.2011    source источник
comment
Для записи: DR 484 Может ли имя спецификатора базы cv-qualified class type? указывает на C++11 §9.1/5: Если typedef-name, которое называет тип класса cv-qualified, используется там, где требуется class-name, cv-qualifiers игнорируется. Итак, это ошибка GCC.   -  person Potatoswatter    schedule 28.04.2011


Ответы (1)


Я считаю, что это соответствует стандарту. В частности, §9.1/5: «typedef-name (7.1.3), которое называет класс, является class-name, [...]».

person Jerry Coffin    schedule 28.04.2011
comment
Ха! Я только искал конструктивное определение имя-класса. Спасибо! (Грр, надо подождать одну минуту.) - person Potatoswatter; 28.04.2011
comment
Теперь это поднимает вопрос о том, что должно происходить с типом базового класса с квалификацией const… время для более глубокого изучения… - person Potatoswatter; 28.04.2011
comment
@Potatoswatter: стандарт следует рассматривать целостно, что означает, что только те, кто запомнил всю эту чертову штуку, могут быть полностью уверены в чем-либо (и, конечно же, никто не запомнил все это)! - person Jerry Coffin; 28.04.2011
comment
@Jerry: Да ладно, мы оба знаем Йоханнеса… - person Potatoswatter; 28.04.2011
comment
@Potatoswatter: так же хорош, как Йоханнес (и он определенно хорош хорош), я почти уверен, что он знает это не так хорошо, как Эндрю Кениг (бывший редактор) или Пит Беккер (нынешний редактор) . Он настолько большой, что большинство авторов не помнят всех частей, написанных ими лично! Однажды я отправил несколько незначительных правок (но намного меньше, чем написало большинство членов комитета), и я даже не помню все части, которые я написал... - person Jerry Coffin; 28.04.2011
comment
@Jerry: Я шучу, шучу. Но я бы не стал недооценивать его способность к интеграции. Он всего пару лет там… - person Potatoswatter; 28.04.2011
comment
@Potatoswatter: Как я уже сказал, он определенно хороший. Я разговаривал либо лично, либо через Usenet со значительной частью комитета, и Йоханнес находится в одной лиге с лучшими из них. Однако у Эндрю есть некоторое несправедливое преимущество: он так же гениален, как Йоханнес, и он занимается этим уже несколько десятилетий... - person Jerry Coffin; 28.04.2011
comment
Что касается меня, то по сравнению с Андреем я точно не в его лиге. Я смотрю на него с благоговением и страхом. - person Johannes Schaub - litb; 28.04.2011
comment
@Johannes: благоговение оправдано, но вы, честно говоря, в его лиге, или, по крайней мере, можете быть, когда у вас есть подобный опыт. Опасения, по крайней мере, из того, что я видел, на самом деле не оправданы - по крайней мере, IME, Эндрю кажется действительно приятным человеком. - person Jerry Coffin; 28.04.2011