std :: is_const将const指针标识为非const

jbc*_*coe 5 c++ templates c++11

我对std::is_constconst指针识别为非的行为感到困惑const.我自己的实现is_const完全一样.我不确定为什么<T><const 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;
}
Run Code Online (Sandbox Code Playgroud)

在两个实例中is_const<const CEmptyClass*>::value返回0

K-b*_*llo 18

没有const参考这样的东西,参考永远不会const.这样的代码不能编译:

int& const i;
Run Code Online (Sandbox Code Playgroud)

现在,如果您要删除您的引用,它将起作用.如果你要放在const右侧(语义上是相同的东西),并向后阅读类型

CEmptyClass const&
Run Code Online (Sandbox Code Playgroud)

它会读取引用常量 CEmptyClass,不是一个常量 引用CEmptyClass.

更新:既然你改变了对指针的引用,那么同样的误解仍然存在:

const CEmptyClass*
CEmptyClass const*
Run Code Online (Sandbox Code Playgroud)

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

CEmptyClass* const
Run Code Online (Sandbox Code Playgroud)

是一个指向CEmptyClass 的const指针

const CEmptyClass* const
CEmptyClass const* const
Run Code Online (Sandbox Code Playgroud)

是const CEmptyClass 的const指针.

  • @j code:`const T*`与`T const*`相同,它是_pointer_到_const_ _T_,再次**NOT**`const`.另外,`T*const`或`const T*const`或`T const*const`将是`const`. (2认同)