代码之家  ›  专栏  ›  技术社区  ›  msc

为什么“std::is\u pointer<std::nullptr\u t>::value”等于false?

  •  10
  • msc  · 技术社区  · 7 年前

    我读到 std::is_pointer 在C++中。

    然后我编写了程序并检查是否 T 是指针类型或未使用 std::is\U指针 .

    #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 ?

    5 回复  |  直到 7 年前
        1
  •  20
  •   Nicol Bolas    7 年前

    因为 std::nullptr_t 不是指针类型 . 和 is_pointer 仅计算为 true 对于指针类型。

    nullptr_t 不是吗 指针。的确 不是类类型、整数、浮点、枚举数或除 is_null_pointer 类型它在类型分类上有自己独特的分类。

        2
  •  8
  •   StoryTeller - Unslander Monica    7 年前

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

    如中所述 [lex.nullptr]

    指针文字是关键字nullptr。它是类型的prvalue std::nullptr\u t。[注意:std::nullptr\u t是一种独特的类型 既不是指针类型,也不是指向成员类型的指针;相反,a 此类型的prvalue是空指针常量,可以进行转换 设置为空指针值或空成员指针值。参见[conv.ptr] 和[conv.mem]。结束注释]

        3
  •  6
  •   zneak    7 年前

    虽然听起来不那么直观, std::nullptr_t 不是指针类型。例如, you cannot dereference a std::nullptr_t ,所以如果 is_pointer_type<nullptr_t>::value true .

    它仅可转换为任何指针类型。

        4
  •  4
  •   songyuanyao    7 年前

    因为 std::nullptr_t nullptr .

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

    根据标准, 21.2.3 Null pointers [support.types.nullptr]

    类型 nullptr_­t 是a类型的同义词 它具有[basic.basic]和[conv.ptr]中描述的特征。

        5
  •  0
  •   user541686    2 年前

    在某些情况下,这肯定是不直观的,但它是有意义的:

    1. 就值而言,它的行为不像指针;它不能 指向任何东西 .
      例如,你不能做

      T *p = ...;
      reinterpret_cast<T *>(reinterpret_cast<std::nullptr_t>(p));
      

      并期望得到一个指向相同地址的指针 p 指向。

    2. 就类型而言,它的行为不像指针。例如

      std::is_pointer<P>::value
      

      应该暗示

      std::is_same<P, std::remove_pointer<P>::type *>::value
      

      但事实显然并非如此。