Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的CV限定基类+;_C++_C++11_Language Lawyer - Fatal编程技术网

C++ C+中的CV限定基类+;

C++ C+中的CV限定基类+;,c++,c++11,language-lawyer,C++,C++11,Language Lawyer,在重构一些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

在重构一些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;
}
我有两个问题:

<> LI> C++标准中禁止定义CV限定基类,如果有的话?
  • 第二个示例为什么编译

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

    < P>它实际上是您创建的完整对象,它是const或const,类不是CV合格。 在
    中,使用AC=常数常量在用于继承时被忽略

  • 语法禁止这样做。基类是在本标准第10节开头规定的基本子句中指定的。它最终解析为基类型说明符,即class或decltype,它是
    decltype
    构造或嵌套名称说明符[opt]类名。请注意,这不会为cv说明符留下任何位置

  • typedef名称符合语法。9.1/5说“命名类类型或其cv限定版本的typedef名称也是类名。”常量被忽略

  • 常量被忽略了。基类子对象本身不能是常量。9.1/5规定“如果在需要类名的地方使用了命名cv限定类类型的typedef名称,则cv限定符将被忽略。”


  • 您仍然可以使用常量合成…除了jarrod42所说的之外,“B是a
    const
    a”是什么意思?B
    const
    不是也一样吗?是的,我想,但为什么呢?
    AC
    真的是一个const
    而不仅仅是
    A
    :。@jotik定义父亲没有看到cv分区对象的任何用途,我不认为它比这更像是这个决定背后的原因。9.1/5也与问题1相关,它还说“一个typedef名称”(7.1.3)命名一个类类型或其cv限定版本也是一个类名。“标准中的语法规则没有在类名下明确包含typedef名称。出于某种原因,这仅在附录中给出了注释。