jbc*_*coe 5 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;
}
Run Code Online (Sandbox Code Playgroud)
在两个实例中is_const<const CEmptyClass*>::value返回0
K-b*_*llo 18
没有const参考这样的东西,参考永远不会const.这样的代码不能编译:
int& const i;
Run Code Online (Sandbox Code Playgroud)
现在,如果您要删除您的引用,它将起作用.如果你要放在const右侧(语义上是相同的东西),并向后阅读类型
CEmptyClass const&
Run Code Online (Sandbox Code Playgroud)
它会读取引用到常量 CEmptyClass,不是一个常量 引用到CEmptyClass.
更新:既然你改变了对指针的引用,那么同样的误解仍然存在:
const CEmptyClass*
CEmptyClass const*
Run Code Online (Sandbox Code Playgroud)
两者都是相同的,一个指向const CEmptyClass 的非const指针
CEmptyClass* const
Run Code Online (Sandbox Code Playgroud)
是一个指向CEmptyClass 的const指针
和
const CEmptyClass* const
CEmptyClass const* const
Run Code Online (Sandbox Code Playgroud)
是const CEmptyClass 的const指针.