std::is_const 将常量指针标识为非常量指针
std::is_const identifies const pointer as non-const
我对std::is_const
将const
指针识别为非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 的引用,而不是对 CEmptyClass 的 const引用。
更新:现在您更改了对指针的引用,同样的错误构造仍然存在:
const CEmptyClass*
CEmptyClass const*
两者都是相同的,一个指向常量 CEmptyClass 的非常量指针
CEmptyClass* const
是指向 CEmptyClass 的常量指针
和
const CEmptyClass* const
CEmptyClass const* const
是指向 const CEmptyClass 的 const 指针。
相关文章:
- 将常量指针引用绑定到非常量指针
- 如何使用数据对象上的常量指针初始化类
- C++中的指针和常量问题不大
- 为什么我收到"从常量指针到指针的转换无效?
- 当成员值从指针更改为非指针时,C++常量问题
- 使用双指针传递 2D 常量数组
- C++/QT:使用指向私有成员的常量指针作为只读数据共享
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 模板推导:为什么函数指针模板定义在常量和/或引用时不匹配?
- 初始化指针的常量向量
- 区分接受常量参数的函数引用/指针和与函数参数同名的非常量参数
- 什么是常量指针常量引用类型的参数?(const X* const & p)
- 无法将"常量指针常量"传递给常量引用
- C++:如何创建一个临时对象,包含一个指针 - 常量或非常量,具体取决于上下文
- 具有函数指针常量数组的 C++ 模板化静态类
- 这个constexpr整数不是空指针常量吗
- 使指针常量C++
- C++11在stl容器中共享指针常量
- 空指针常量转换为右值
- 在参考 (T&) 和常量指针 (T* 常量) 之间进行选择