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

时间:2012-06-03 00:08:34

标签: 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;
}

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

1 个答案:

答案 0 :(得分:18)

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

int& const i;

现在,如果你要删除你的引用,那就行了。如果你要将const置于右侧(语义上是相同的),并向后读取类型

CEmptyClass const&

它会将引用读取到 const CEmptyClass const 引用 CEmptyClass

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

const CEmptyClass*
CEmptyClass const*

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

CEmptyClass* const

是指向CEmptyClass

const 指针

const CEmptyClass* const
CEmptyClass const* const

是指向const CEmptyClass的 const 指针。