typedef-name作为基类:非法但广泛容忍

Pot*_*ter 4 c++ inheritance templates typedef

[class.derived]的第一段说基类说明符,

如果找到的名称不是类名,则程序格式错误.

但是,一个简单的测试显示Comeau并且g++ -ansi -pedantic都接受typedef-name作为基础.一个简单grep -r '[^:]: mpl'的Boost标题显示,流行的库通常依赖于这种行为.

有没有编译器实际上拒绝typedef了基类说明符中的某个类?GCC甚至检查基类类型不是const,这改进了非标准功能.

有解决方法吗?我唯一能想到的是用C++ 11别名模板替换typedef.模板化的别名声明声明了一个模板名称,然后可以成为一个类名...我想.这可能需要alias-declaration的伪参数.

也许应该调整标准以匹配编译器的一致行为.DR有吗?

Jer*_*fin 6

我相信这符合标准.具体来说,§9.1/ 5:" 命名类的typedef-name(7.1.3)是一个类名,[...]".