Следующий код недействителен:
struct base {
};
struct inherit : const base {
};
Вы не можете наследовать от типа const
.
Изменяется ли ситуация при использовании шаблонов? Другими словами, действительно ли этот код действителен:
struct base {
};
template<typename T>
struct inherit : T {
using T::T;
};
int main() {
inherit<base const>{};
}
gcc говорит, что это хорошо, но clang reports
<source>:6:2: error: 'const base' is not a direct base of 'inherit<const base>', cannot inherit constructors
using T::T;
^ ~
<source>:10:2: note: in instantiation of template class 'inherit<const base>' requested here
inherit<base const>{};
^
1 error generated.
Compiler returned: 1
Чтобы сделать clang счастливым, мне нужно сделать что-то вроде этого:
template<typename T>
struct inherit : T {
using U = std::remove_const_t<T>;
using U::U;
};
Какая версия верна? Или они не являются правильными, и мне нужно наследовать от std::remove_const_t<T>
?