gpt4 book ai didi

c++ - C++ 中 CV 限定的基类

转载 作者:IT老高 更新时间:2023-10-28 21:51:24 25 4
gpt4 key购买 nike

在重构一些 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:由于这是一个language-lawyer问题,请提供对C++标准的引用。

最佳答案

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

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

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

关于c++ - C++ 中 CV 限定的基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35935671/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com