Как понять исходный код nullptr в LLVM?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как понять исходный код nullptr в LLVM?

Сообщение Anonymous »

Недавно мне захотелось узнать, как работает nullptr. В http://www.stroustrup.com/N1488-nullptr.pdf я нашел этот код:

Код: Выделить всё

const // this is a const object...
class {
public:
template // convertible to any type
operator T*() const // of null non-member
{ return 0; } // pointer...
template // or any type of null
operator T C::*() const // member pointer...
{ return 0; }
private:
void operator&() const; // whose address can’t be taken
} nullptr = {};
Затем я снова поискал ключевое слово nullptr в Woboq и обнаружил, что исходный код в 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 
_LIBCPP_ALWAYS_INLINE _LIBCPP_CONSTEXPR
operator _Tp* () const {return 0;}
template 
_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()
Самое отличие состоит в том, что он определяет структуру __nat и две функции

Код: Выделить всё

_LIBCPP_ALWAYS_INLINE _LIBCPP_CONSTEXPR nullptr_t(int __nat::*) : __lx(0) {}
_LIBCPP_ALWAYS_INLINE _LIBCPP_CONSTEXPR operator int __nat::*() const {return 0;}
Я долго об этом думал, но до сих пор не понимаю, почему LLVM реализовал это именно так. Может кто-нибудь дать мне совет?

Подробнее здесь: https://stackoverflow.com/questions/520 ... tr-in-llvm
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»