2012-06-03 33 views
4

我很困惑std::is_const在标识const指针时的行为为非const。 我自己实现的is_const完全一样。我不知道为什么更通用的模板结构<T>正在挑选<const T>版本。 gcc4.7和clang3.1-svn都显示相同的行为。任何人都可以解释发生了什么?下面的代码给出:std :: is_const将const指针标识为非const

#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

+3

*我对'std :: is_const'在识别const指针时的行为感到困惑 - 非const。*代码中没有* const指针*,只有*非const指向const的指针* –

+0

您'很对。我正在考虑将const指向const,而不是。 – jbcoe

回答

17

有作为const参考没有这样的事,一提的是从来没有const。像这样的代码不能编译:

int& const i; 

现在,如果您要删除您的参考,它会工作。如果你要放置const右侧(语义上是一样的东西),并阅读类型向后

CEmptyClass const& 

它会读取参考常量CEmptyClassconst参考CEmptyClass

更新:现在你改变了参考指针,同样的误会坚持:

const CEmptyClass* 
CEmptyClass const* 

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

CEmptyClass* const 

const指向CEmptyClass的指针

const CEmptyClass* const 
CEmptyClass const* const 

是一个常量指针一个const CEmptyClass。

+0

是的。改变对指针的引用(问题和代码更新)仍然留下了神秘的行为。为什么'const T *'不是'const'? – jbcoe

+2

@j代码:'const T *'和'T const *'是一样的,它是一个_pointer_到_const_ _T_,同样是** NOT **'const'。此外,'T * const'或'const T * const'或'T const * const'将会是'const'。 –

+0

谢谢,这很有道理。 – jbcoe

相关问题