typedef-name как базовый класс: незаконно, но широко допустимо - PullRequest
4 голосов
/ 28 апреля 2011

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

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

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

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

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

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

1 Ответ

6 голосов
/ 28 апреля 2011

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

...