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