Во время рефакторинга кода С++ 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;
}
У меня есть два вопроса:
- Что в стандартах С++ запрещает определять базовый класс с квалификацией CV, если вообще?
- Почему второй пример компилируется?
PS: Поскольку это вопрос language-lawyer, просьба указать ссылки на стандарт С++.