您能否告诉我这些模板中使用了哪些类型推断和类型操作规则,从而消除了常量性?为什么会发生这种情况?
#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;
}
据我了解,继承用于不重新定义类型字段。声明中使用了什么类型推断规则using type = T?起初我以为恒常性、参照性和波动性在这里被丢弃了,但事实证明并非如此。这是一个类型别名,这里不丢弃常量性。type模板中的字段如何专门化remove_const以const T丢弃常量?为什么她会被拒绝?
可用的
让我们看一个例子
编译器查看这两个选项,发现第二个选项根本没有通过,第一个选项仍然存在
其中
T === mytype. 方法,变成
T,即 只是mytype。现在让我们
编译器查看这两个选项,发现对于第一个选项,一切都适用于
T === const mytype,而对于第二个选项,一切都适用于T === mytype。同时,第二个选项“更合适”(要弄清楚到底为什么以及如何 - 请参阅标准),因此选择它,与(让我再次提醒您)T === mytype。其中
T === mytype. 方法,和以前一样,它只是变成
T,即 在mytype.是不是更清楚了?
如果您为参数指定有意义的名称,一切都会变得更加清晰。并且不要表现得像朋友:
在这样的模板声明中,很明显模板
const参数可以是带有或不带有限定符的类型。此外,在声明专门化时,很明显,专门化的参数可以只是一个类型,而不需要限定符。在这种情况下,模板参数在模板名称后面的尖括号中指定,就像在实例化期间一样。那些。这里的模板 参数
TypeMaybeWithConst将是const JustType进一步地,当模板实例化时,
remove_const<const int>模板参数的TypeMaybeWithConst类型为const int,当编译器开始选择合适的特化时,它会尝试将模板const JustType参数与实际的模板const int参数进行匹配,匹配成功后,输出特化JustType参数为int.