C++ C+中的CV限定基类+;
在重构一些C++11代码时,我偶然发现了一件奇怪的事情。也就是说,似乎不可能定义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
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是aconst
a”是什么意思?Bconst
不是也一样吗?是的,我想,但为什么呢?AC
真的是一个const
而不仅仅是A
:。@jotik定义父亲没有看到cv分区对象的任何用途,我不认为它比这更像是这个决定背后的原因。9.1/5也与问题1相关,它还说“一个typedef名称”(7.1.3)命名一个类类型或其cv限定版本也是一个类名。“标准中的语法规则没有在类名下明确包含typedef名称。出于某种原因,这仅在附录中给出了注释。