[英]Why does `std::add_pointer`, adds a previously removed `const`?
如果标题有点误导,我们深表歉意。情况就是这样。
考虑以下示例:
template<typename T>
static std::string demangle_typename()
{
int status = 0;
return abi::__cxa_demangle(typeid(T).name(),nullptr,nullptr,&status);
}
void foo()
{
typedef const int* Type;
std::cout<< demangle_typename<Type>() <<std::endl; // type is: int const * <ok>
}
类型是int const *
现在,当我使用std::remove_pointer
删除const *
部分并且我使用std::add_pointer
在没有const
情况下添加指针时, const
重新出现。 为什么?
void foo()
{
typedef const int* Type;
std::cout<< demangle_typename<Type>() <<std::endl; // type is: int const * <ok>
typedef typename std::remove_pointer<Type>::type rp_Type; // int
typedef typename std::add_pointer<rp_Type>::type p_Type; // int const * <???>
std::cout<< demangle_typename<p_Type>() <<std::endl; // type is: int const * <???>
}
要获得没有const
的指针,我需要使用std::remove_const
。 但是为什么需std::remove_pointer
,因为std::remove_pointer
已经删除了const
?
void foo()
{
typedef const int* Type;
std::cout<< demangle_typename<Type>() <<std::endl; // type is: int const * <ok>
typedef typename std::remove_pointer<Type>::type rp_Type; // int
typedef typename std::remove_const<rp_Type>::type rc_Type; // int
typedef typename std::add_pointer<rc_Type>::type p_Type; // int*
std::cout<< demangle_typename<p_Type>() <<std::endl; // type is: int* <ok>
}
在线代码示例: https : //rextester.com/YYE94945
typeid
丢弃类型上的顶级 cv 限定符。 它没有看到int
和const int
之间的任何区别。
std::remove_pointer_t<const int *>
是const int
而不是int
,但因此不会打印const
。
您的demangle_typename
不适合此处的用途:它不会向您显示顶级const
,因此您的结果不是正确的观察结果。 (不过可以修复! )
rp_Type
不是int
而是const int
。
删除指针层不会删除指针对象的常量性。
所以const
不是“添加”的; 它从未真正被移除。 当它是顶级时,你只是没有观察它,用你的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.