我在阅读有关C++的std::is_pointer
。
然后,我编写了程序,并使用std::is_pointer
来检查T
是否为指针类型。
#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演示]
char : false
char * : true
char ** : true
char *** : true
std::nullptr_t : false
为什么
std::is_pointer<std::nullptr_t>::value
等于 false
?
0
作为空指针内容是一团糟。 - M.Mnullptr_t
不是类类型?这是否明确规定?[lex.nullptr] 只说明它不是指针类型。 - Quentin0
的特殊语义非常棘手,但我本来想象/希望nullptr
可以成为它自己的类型,但是那个类型将会是一个指针类型(就像void*
是一个带有一些特殊语义的指针类型)。 - MikeMBtemplate <typename T> void f(T*); f(nullptr)
成为有效调用。目前,如果你想允许这个调用,你必须添加一个重载void f(std::nullptr_t)
,但是这个重载可以转发到例如f<void*>
。然而,如果nullptr
是一个指针类型并且你不想要它,从重载集中删除它会更加复杂。 - MSaltersis_null_pointer
是一个主类型类别;对于任何类型T
,只有一个主类型类别特性将为true。 - Nicol Bolas