C++ nullptr

nullptr表示指针,它的类型是std::nullptr_t(nullptr有类型!NULL没有类型),它是prvalue

  1. 可以看到nullptr经编译器生成的汇编代码会直接变为0,所以nullptr是一个有类型的常量0(注意有极个别的平台可能不为0,"Seriously, have any actual machines really used nonzero null pointers, or different representations for pointers to different types?"

  2. 还可以看到即便newanewint都初始化为nullptr,但是他们的地址是不同的

  3. 由于nullptr具有类型,所以可以作为模板和函数的参数

    template<class T>
    constexpr T clone(const T& t)
    {
        return t;
    }
    
    void f(std::nullptr_t)
    {
       std::cout << "null pointer overload\n";
    }
    
    int main()
    {
        clone(nullptr); // Fine
    //  clone(NULL);    // ERROR: non-literal zero cannot be a null pointer constant
    //  clone(0);       // ERROR: non-literal zero cannot be a null pointer constant
        f(clone(nullptr)); // Fine
    }
    
  4. nullptr可以隐式转换其他的指针

    void f(int) // f(nullptr) 编译错误
    void f(int*) // f(nullptr) 编译成功,隐式转换为int*
    void f(double*) // 如果同时存在f(int*)和f(double*),则编译报错[函数重载调用不明确]
    void f(std::nullptr_t) // 如果同时存在f(int*)和f(double*)和f(std::nullptr_t),则优先匹配f(std::nullptr_t)
    
  5. std::nullptr_t定义的不同变量有不同的地址

posted @ 2023-01-03 10:19  miyanyan  阅读(48)  评论(0编辑  收藏  举报