为什么std :: remove_pointer也会删除const限定符

时间:2013-09-19 18:18:21

标签: c++ c++11 typetraits

请考虑以下代码:

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应该产生完全相同的类型(限定符和全部)。

这是正确的行为,还是这可能是编译器实现的问题?

2 个答案:

答案 0 :(得分:4)

这是一个编译错误。根据标准(§20.9.7.5, 表56):“template struct remove_pointer;: 如果T具有类型'(可能是cv-qualified)指针T1'那么成员 typedef类型应命名为T1;否则,它应命名T.“它 永远不应删除任何constvolatile限定符 结果。

答案 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。