[class.derived]的第一段说明了基类说明符,
如果找到的名称不是类名,则该程序格式不正确。
但是,simple测试表明,Comeau和g++ -ansi -pedantic
都接受typedef-name作为基础。一个简单的grep -r '[^:]: mpl'
超过Boost标题,表明流行的库通常依赖于这种行为。
是否有任何编译器实际上拒绝了基本说明符中的typedef
类? GCC甚至会检查基类类型是否为const
,这会改进非标准功能。
有解决方法吗?我唯一能想到的是用C ++ 11别名模板替换typedef。模板化的别名声明声明了一个模板名称,然后可以成为一个类名...我想。这可能需要alias-declaration的伪参数。
也许应该调整标准以匹配编译器的一致行为。有DR吗?
答案 0 :(得分:6)
我相信这符合标准。具体来说,§9.1/ 5:“一个 typedef-name (7.1.3)命名一个类是类名,[...]”。