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

时间:2011-04-28 04:05:27

标签: c++ templates inheritance typedef

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

  

如果找到的名称不是类名,则该程序格式不正确。

但是,simple测试表明,Comeau和g++ -ansi -pedantic都接受typedef-name作为基础。一个简单的grep -r '[^:]: mpl'超过Boost标题,表明流行的库通常依赖于这种行为。

是否有任何编译器实际上拒绝了基本说明符中的typedef类? GCC甚至会检查基类类型是否为const,这会改进非标准功能。

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

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

1 个答案:

答案 0 :(得分:6)

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