在重构一些C ++ 11代码时,我偶然发现了一件奇怪的事情。也就是说,似乎无法定义CV限定的(const
,volatile
或const volatile
)基类,例如:
struct A { int a = 0; };
struct B: A const {}; // Error here with Clang and GCC!
但是,以下编译没有错误:
struct A { int a = 0; };
using AC = A const;
struct B: AC {}; // NO ERROR HERE!? Qualifiers are ignored.
int main() {
B b;
b.a = 42; // NO ERROR modifying a field of const base.
return b.a;
}
我有两个问题:
PS:由于这是 language-lawyer 问题,请提供对C ++标准的参考。
答案 0 :(得分:21)
语法禁止它。基类使用在标准第10节开头指定的 base-clause 生产指定。它最终解析为<em> base-type-specifier ,它是 class-or-decltype ,它是decltype
构造或嵌套名称-specifier [opt] class-name 。请注意,这不会为cv-specifier留下任何空间。
typedef名称适合语法。 9.1 / 5说“命名类类型的typedef-name或其cv限定版本也是类名。”简单地忽略了const。
简单地忽略了const。基类子对象不能自己成为const。 9.1 / 5说“如果在需要类名的情况下使用命名cv限定类类型的typedef-name,则忽略cv限定符。”
答案 1 :(得分:7)
实际上,您创建的完整对象是const或非const,类不是cv限定的。
在using AC = A const;
中,当用于继承时,const被忽略。