C++符合 CV 标准的基类
CV-qualified base classes in C++
在重构一些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;
}
我有两个问题:
- C++标准中的哪些内容禁止定义符合 CV 条件的基类(如果有的话)?
- 为什么编译第二个示例?
PS:由于这是一个语言律师问题,请提供C++标准的参考。
-
语法禁止这样做。基类是用标准第 10 节开头指定的基句生产指定的。它最终解析为base-type-specifier,它是class-or-decltype,它要么是
decltype
构造,要么是嵌套名称说明符[opt]类名。请注意,这没有给 cv 说明符留下任何位置。 -
typedef 名称适合语法。 9.1/5 说"命名类类型或其 cv 限定版本的 typedef-name 也是类名。常量被简单地忽略。
-
常量被简单地忽略。基类子对象不能单独是 const。9.1/5 说"如果在需要类名的地方使用命名 cv 限定类类型的 typedef-name,则忽略 cv 限定符。
实际上是你创建的完整对象是常量或不是常量,类不是 cv 限定的。
using AC = A const;
const 在用于继承时被简单地忽略。
相关文章:
- std::具有相同基类的类的变体
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 基类中的函数名称解析
- C++初始化基类
- 如何通过派生类函数更改基类中的向量
- 如何定义一个纯抽象基类
- 如何使用基类指针引用派生类成员
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 如何引用基类的派生类?
- 如果基类包含双指针成员,则派生类的构造函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 为什么此派生对象无法访问基类的后递减方法?
- 公开最直接的基类模板名称
- 您将如何使用标准引号解释指向基类和派生类成员的指针的这种差异?
- C++符合 CV 标准的基类
- 空基类优化现在是强制优化吗(至少对于标准布局类)
- 标准如何支持在基类S中调用纯虚拟函数
- C++ - 从基类"inherit"重载赋值运算符派生类的安全/标准方法