Почему в шаблоне remove_const отбрасывается константность?
Скажите, пожалуйста, какие правила выведения типов и работы с типами используются в этих шаблонах, в результате чего получается удаление константности? Почему так происходит?
#include <iostream>
template<typename T>
struct type_is {
using type = T;
};
template<typename T>
struct remove_const : type_is<T> {
};
template<typename T>
struct remove_const<const T> : type_is<T> {
};
template<typename U, typename V>
constexpr bool same = std::is_same_v<U, V>;
int main(int argc, char **argv)
{
static_assert(same<remove_const<const int>::type, int>);
return 0;
}
Как я понимаю, наследование используется для того, чтобы повторно не определять поле type. А какие правила выведения типов используются в декларации using type = T
? Я сначала думал, что здесь отбрасывается константность, ссылочность и волатайлность, но оказалось, что это не так. Это псевдоним типа и константность здесь не отбрасывается. Каким образом поле type
в специализации шаблона remove_const
для const T
отбрасывает константность? Почему она отбрасывается?