如何在LLVM中理解'nullptr'的源代码?

时间:2018-08-29 07:32:54

标签: c++ libc++

最近,我想知道nullptr的工作方式。在http://www.stroustrup.com/N1488-nullptr.pdf中,找到了代码。(对不起,我没有10个声誉,因此我无法在此处发布图片,您可以点击上面的链接,代码位于第3页。)

代码很酷。然后我再次在Woboq中搜索了关键字nullptr,发现LLVM中的源代码与上面的不同,我将它们复制到下面。

struct _LIBCPP_TEMPLATE_VIS nullptr_t
{
    void* __lx;
    struct __nat {int __for_bool_;};
    _LIBCPP_ALWAYS_INLINE _LIBCPP_CONSTEXPR nullptr_t() : __lx(0) {}
    _LIBCPP_ALWAYS_INLINE _LIBCPP_CONSTEXPR nullptr_t(int __nat::*) : __lx(0) {}
    _LIBCPP_ALWAYS_INLINE _LIBCPP_CONSTEXPR operator int __nat::*() const {return 0;}
    template <class _Tp>
        _LIBCPP_ALWAYS_INLINE _LIBCPP_CONSTEXPR
        operator _Tp* () const {return 0;}
    template <class _Tp, class _Up>
        _LIBCPP_ALWAYS_INLINE
        operator _Tp _Up::* () const {return 0;}
    friend _LIBCPP_ALWAYS_INLINE _LIBCPP_CONSTEXPR bool operator==(nullptr_t, nullptr_t) {return true;}
    friend _LIBCPP_ALWAYS_INLINE _LIBCPP_CONSTEXPR bool operator!=(nullptr_t, nullptr_t) {return false;}
};
inline _LIBCPP_ALWAYS_INLINE _LIBCPP_CONSTEXPR nullptr_t __get_nullptr_t() {return nullptr_t(0);}
#define nullptr _VSTD::__get_nullptr_t()

最大的不同是,它定义了struct __nat和两个函数

_LIBCPP_ALWAYS_INLINE _LIBCPP_CONSTEXPR nullptr_t(int __nat::*) : __lx(0) {}
_LIBCPP_ALWAYS_INLINE _LIBCPP_CONSTEXPR operator int __nat::*() const {return 0;}

我想了很久,但我仍然不明白为什么LLVM会这样实现它。有人可以给我什么建议吗?

1 个答案:

答案 0 :(得分:-1)

'nullptr_t'和'nullptr'是不同的东西。

'nullptr'只是一个'size_t'值-在所有平台上可能均为0。

'nullptr_t'是一种类型,允许您的代码静态执行 检查并区分过载,例如:

void f(int* pi)
{
   std::cout << "Pointer to integer overload\n";
}

void f(double* pd)
{
   std::cout << "Pointer to double overload\n";
}

void f(std::nullptr_t nullp)
{
   std::cout << "null pointer overload\n";
}

如果您调用'f(nullptr)',如果未定义最后一个,则会调用该重载?

当然您可以只调用'f((int *)nullptr)'或'f((double *)nullptr)'...