我对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
答案 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 指针。