std::is_const 将常量指针标识为非常量指针

std::is_const identifies const pointer as non-const

本文关键字:指针 常量 标识 非常 is const std      更新时间:2023-10-16

我对std::is_constconst指针识别为非const的行为感到困惑。我自己对is_const的实现也做了完全相同的事情。我不确定为什么在<const T>版本中选择更通用的模板化结构<T>。gcc4.7 和 clang3.1-svn 都表现出相同的行为。谁能解释一下发生了什么?代码给出如下:

#include <iostream>
#include <sstream>
#include <type_traits>
class CEmptyClass {}; 
namespace jbc 
{
  template <typename T>
  struct is_const : std::false_type {}; 
  template <typename T>
  struct is_const<const T> : std::true_type {}; 
}
int main(int argc, char* argv[])
{
  std::cout << "Is 'const CEmptyClass*' constant according to std lib : " 
    << std::is_const<const CEmptyClass*>::value << std::endl;
  std::cout << "Is 'const CEmptyClass*' constant according to jbc : " 
    << jbc::is_const<const CEmptyClass*>::value << std::endl;
}

在这两种情况下,is_const<const CEmptyClass*>::value返回0

没有const引用这样的东西,引用永远不会const。像这样的代码无法编译:

int& const i;

现在,如果您要删除引用,它将起作用。如果你把const放在右侧(语义上是一回事),然后向后阅读类型

CEmptyClass const&
它将读取对 const CEmptyClass 的引用

而不是CEmptyClassconst引用

更新:现在您更改了对指针的引用,同样的错误构造仍然存在:

const CEmptyClass*
CEmptyClass const*

两者都是相同的,一个指向常量 CEmptyClass 的非常量指针

CEmptyClass* const

是指向 CEmptyClass 的常量指针

const CEmptyClass* const
CEmptyClass const* const

是指向 const CEmptyClass 的 const 指针。