Следующий код недействителен:
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 сообщает
<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>
?