我在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??
}
char : false
char * : true
char ** : true
char *** : true
std::nullptr_t : false
为什么std::is_pointer<std::nullptr_t>::value
等于false
?
答案 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>::value
为true
,则会非常奇怪。
它只能转换为任何指针类型。
答案 3 :(得分:3)
因为std::nullptr_t本身不是指针类型,而是空指针文字nullptr
的类型。
std::nullptr_t
是空指针文字nullptr
的类型。它是一种不同的类型,它本身不是指针类型或指向成员类型的指针。
从标准21.2.3 Null pointers [support.types.nullptr]
开始类型
nullptr_t
是nullptr
表达式类型的同义词,它具有[basic.fundamental]和[conv.ptr]中描述的特征。