C ++中的CV限定基类

时间:2016-03-11 08:42:31

标签: c++ c++11 language-lawyer

在重构一些C ++ 11代码时,我偶然发现了一件奇怪的事情。也就是说,似乎无法定义CV限定的(constvolatileconst 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;
}

我有两个问题:

  1. C ++标准中有哪些禁止定义CV合格的基类(如果有的话)?
  2. 为什么第二个例子编译?
  3. PS:由于这是 language-lawyer 问题,请提供对C ++标准的参考。

2 个答案:

答案 0 :(得分:21)

  1. 语法禁止它。基类使用在标准第10节开头指定的 base-clause 生产指定。它最终解析为<​​em> base-type-specifier ,它是 class-or-decltype ,它是decltype构造或嵌套名称-specifier [opt] class-name 。请注意,这不会为cv-specifier留下任何空间。

  2. typedef名称适合语法。 9.1 / 5说“命名类类型的typedef-name或其cv限定版本也是类名。”简单地忽略了const。

  3. 简单地忽略了const。基类子对象不能自己成为const。 9.1 / 5说“如果在需要类名的情况下使用命名cv限定类类型的typedef-name,则忽略cv限定符。”

答案 1 :(得分:7)

实际上,您创建的完整对象是const或非const,类不是cv限定的。

using AC = A const;中,当用于继承时,const被忽略。