В первом абзаце [class.derived] говорится о спецификаторах базового класса,
Если найденное имя не является именем класса, программа не сформирована.
Однако простой простой тест показывает, что Comeau и g++ -ansi -pedantic
оба принимают typedef-name в качестве базы.Простой grep -r '[^:]: mpl'
над заголовками Boost показывает, что популярная библиотека часто полагается на такое поведение.
Был ли какой-либо компилятор когда-либо фактически отклонял typedef
класса в базовом спецификаторе?GCC даже проверяет, что тип базового класса не const
, что уточняет нестандартную функциональность.
Есть ли обходной путь?Единственное, о чем я могу думать, это заменить typedef шаблоном псевдонима C ++ 11.Шаблонное объявление псевдонима объявляет имя шаблона, которое затем может стать именем класса ... Я думаю.Для этого может потребоваться фиктивный параметр в объявлении псевдонима.
Возможно, стандарт должен быть скорректирован с учетом единодушного поведения компиляторов.Есть ли ДР?