C++符合 CV 标准的基类

CV-qualified base classes in C++

本文关键字:基类 标准 CV 符合 C++      更新时间:2023-10-16

在重构一些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. 为什么编译第二个示例?

PS:由于这是一个语言律师问题,请提供C++标准的参考。

  1. 语法禁止这样做。基类是用标准第 10 节开头指定的基句生产指定的。它最终解析为base-type-specifier,它是class-or-decltype,它要么是decltype构造,要么是嵌套名称说明符[opt]类名。请注意,这没有给 cv 说明符留下任何位置。

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

  3. 常量被简单地忽略。基类子对象不能单独是 const。9.1/5 说"如果在需要类名的地方使用命名 cv 限定类类型的 typedef-name,则忽略 cv 限定符。

实际上是你创建的完整对象是常量或不是常量,类不是 cv 限定的。

using AC = A const; const 在用于继承时被简单地忽略。