请考虑以下代码:
typedef const std::string const_string_type;
cout << std::is_const<const_string_type>::value << endl;
cout << std::is_const<std::remove_pointer<const_string_type>::type>::value << endl;
此输出
1
0
这意味着std::remove_pointer<const_string_type>::type
从该类型中删除了const
限定符。我的理解是,如果类型不是指针,std::remove_pointer
应该产生完全相同的类型(限定符和全部)。
这是正确的行为,还是这可能是编译器实现的问题?
答案 0 :(得分:4)
这是一个编译错误。根据标准(§20.9.7.5,
表56):“template struct remove_pointer;:
如果T具有类型'(可能是cv-qualified)指针T1'那么成员
typedef类型应命名为T1;否则,它应命名T.“它
永远不应删除任何const
或volatile
限定符
结果。
答案 1 :(得分:1)
不,它不会删除const(只从指针中删除限定符而不是指向类型),从this link这是一种可能的实现。
template< class T > struct remove_pointer {typedef T type;};
template< class T > struct remove_pointer<T*> {typedef T type;};
template< class T > struct remove_pointer<T* const> {typedef T type;};
template< class T > struct remove_pointer<T* volatile> {typedef T type;};
template< class T > struct remove_pointer<T* const volatile> {typedef T type;};
结果实际上是编译器中的一个错误,它不应该在任何情况下删除指向类型的const。
编辑这里是标准确认表格中的表格。 20.9.7.5
Pointer modifications
template struct remove_pointer;
如果T具有类型“(可能是cv-qualified)指针到T1”,则成员typedef类型应命名为T1;否则,它应命名为T。