c++ - std::is_const 将 const 指针标识为非常量

标签 c++ templates c++11

我很困惑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

最佳答案

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

int& const i;

现在,如果您要删除您的引用,它就会起作用。如果您要将 const 放在右侧(语义上是同一件事),然后向后读取类型

CEmptyClass const&

它会读取一个 reference const CEmptyClass不是 const CEmptyClass 的引用

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

const CEmptyClass*
CEmptyClass const*

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

CEmptyClass* const

是一个指向 CEmptyClass 的const指针

const CEmptyClass* const
CEmptyClass const* const

是指向 const CEmptyClass 的 const 指针。

关于c++ - std::is_const 将 const 指针标识为非常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10866913/

相关文章:

c++ - 那么在 STL 集合中可以安全地使用 unique_ptr 吗?

c++ - 如何在编译时验证模板类是从给定类派生的?

c++ - 错误 C2440 : '=' : cannot convert from 'ListNode<T> *' to 'ListNode<T> *'

c++ - 编译器如何通过转发引用推断出此类模板?

c++ - GVIM 格式使用 "="for c++

c++ - 获取模板类对象地址导致模板参数全实例化

c++ - 在使用 std::stod 之前初始化 QApplication 的奇怪错误

c++ - 我可以在 MacOS X 10.11 上让 gcc/g++ 指向 ACTUAL gcc/g++ 吗?

c++ - 确保只有一个函数实例在运行?

c++ - std::stack 是连续的吗?