7

我对std::is_const将指针标识const为非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

4

1 回答 1

19

没有参考之类的东西const,参考永远是const。这样的代码无法编译:

int& const i;

现在,如果您要删除参考,它会起作用。如果您要放置const在右侧(语义上是相同的),然后向后读取类型

CEmptyClass const&

它将读取对const CEmptyClass的引用而不是CEmptyClassconst引用

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

const CEmptyClass*
CEmptyClass const*

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

CEmptyClass* const

是一个指向 CEmptyClass的const指针

const CEmptyClass* const
CEmptyClass const* const

是指向 const CEmptyClass的const指针。

于 2012-06-03T00:11:21.910 回答