为什么&#34; std :: is_pointer <std :: nullptr_t> :: value&#34;等于假?

时间:2017-11-14 05:47:19

标签: c++ function c++11 pointers nullptr

我在C ++中阅读了std::is_pointer

然后我编写了程序并使用T检查std::is_pointer是否为指针类型。

#include <iostream>

int main() 
{
    std::cout<<std::boolalpha;
    std::cout<<"char : " <<std::is_pointer<char>::value<<std::endl; // OK
    std::cout<<"char * : "<<std::is_pointer<char *>::value<<std::endl; // OK
    std::cout<<"char ** : "<<std::is_pointer<char **>::value<<std::endl; // OK
    std::cout<<"char *** : "<<std::is_pointer<char ***>::value<<std::endl; // OK
    std::cout<<"std::nullptr_t : "<<std::is_pointer<std::nullptr_t>::value<<std::endl;  // Not ok, Why false??
}

输出[Wandbox Demo]

char : false
char * : true
char ** : true
char *** : true
std::nullptr_t : false

为什么std::is_pointer<std::nullptr_t>::value等于false

4 个答案:

答案 0 :(得分:18)

因为std::nullptr_t 不是指针类型is_pointer仅针对指针类型求值为true

nullptr_t可转换为指针,但不是指针。实际上,nullptr_t不是类类型,整数,浮点,枚举器或除is_null_pointer类型之外的任何类型。它在类型分类中有自己独特的分类。

答案 1 :(得分:7)

因为它不是指针类型。它是一种可以隐式转换为任何指针类型的独特类型。

正如[lex.nullptr]中的说明总结:

  

指针文字是关键字nullptr。它是一种类型的prvalue   的std :: nullptr_t。 [注意:std :: nullptr_t是一种独特的类型   既不是指针类型也不是指向成员类型的指针;相反,a   这种类型的prvalue是一个空指针常量,可以转换   到空指针值或null成员指针值。见[conv.ptr]   和[conv.mem]。 - 结束说明]

答案 2 :(得分:5)

听起来不直观,std::nullptr_t不是指针类型。例如,you cannot dereference a std::nullptr_t,如果is_pointer_type<nullptr_t>::valuetrue,则会非常奇怪。

它只能转换为任何指针类型。

答案 3 :(得分:3)

因为std::nullptr_t本身不是指针类型,而是空指针文字nullptr的类型。

  

std::nullptr_t是空指针文字nullptr的类型。它是一种不同的类型,它本身不是指针类型或指向成员类型的指针。

从标准21.2.3 Null pointers [support.types.nullptr]

开始
  

类型nullptr_­tnullptr表达式类型的同义词,它具有[basic.fundamental]和[conv.ptr]中描述的特征。