Как работает реализация C ++ nullptr?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как работает реализация C ++ nullptr?

Сообщение Anonymous »

Мне любопытно узнать, как работает nullptr . Стандарты n4659 и n4849 скажем: < /p>
  • Это должно иметь тип std :: nullptr_t < /code>; < /li>
    Вы не можете взять его адрес;sizeof(std::nullptr_t) == sizeof(void*);
  • его преобразование в bool является false ;
  • Его значение можно преобразовать в интегральный тип, идентично (void*) 0 , но не обратно;
, так же, как можно конфиденциально, так же, как и концентрически, с тем же, что и конструкция, так же, как и концентрически, с тем же, что и конструктивно, так же, как и концентрация, так же, как и концентрация. (void*) 0 , но имеет другой тип. Я нашел реализацию std :: nullptr_t < /code> на моем устройстве, и это следующее. < /P>

#ifdef _LIBCPP_HAS_NO_NULLPTR

_LIBCPP_BEGIN_NAMESPACE_STD

struct _LIBCPP_TEMPLATE_VIS nullptr_t
{
void* __lx;

struct __nat {int __for_bool_;};

_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR nullptr_t() : __lx(0) {}
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR nullptr_t(int __nat::*) : __lx(0) {}

_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR operator int __nat::*() const {return 0;}

template
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
operator _Tp* () const {return 0;}

template
_LIBCPP_INLINE_VISIBILITY
operator _Tp _Up::* () const {return 0;}

friend _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR bool operator==(nullptr_t, nullptr_t) {return true;}
friend _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR bool operator!=(nullptr_t, nullptr_t) {return false;}
};

inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR nullptr_t __get_nullptr_t() {return nullptr_t(0);}

#define nullptr _VSTD::__get_nullptr_t()

_LIBCPP_END_NAMESPACE_STD

#else // _LIBCPP_HAS_NO_NULLPTR

namespace std
{
typedef decltype(nullptr) nullptr_t;
}

#endif // _LIBCPP_HAS_NO_NULLPTR
< /code>

меня больше интересует первая часть. Кажется, это удовлетворяет пунктам 1-5, но я понятия не имею, почему у него есть подкласс __nat и все, что связано с ним. Я также хотел бы знать, почему это не удалось при интегральных преобразовании. < /P>

struct nullptr_t2{
void* __lx;
struct __nat {int __for_bool_;};
constexpr nullptr_t2() : __lx(0) {}
constexpr nullptr_t2(int __nat::*) : __lx(0) {}
constexpr operator int __nat::*() const {return 0;}
template
constexpr
operator _Tp* () const {return 0;}
template
operator _Tp _Up::* () const {return 0;}
friend constexpr bool operator==(nullptr_t2, nullptr_t2) {return true;}
friend constexpr bool operator!=(nullptr_t2, nullptr_t2) {return false;}
};
inline constexpr nullptr_t2 __get_nullptr_t2() {return nullptr_t2(0);}
#define nullptr2 __get_nullptr_t2()

int main(){
long l = reinterpret_cast(nullptr);
long l2 = reinterpret_cast(nullptr2); // error: invalid type conversion
bool b = nullptr; // warning: implicit conversion
// edditor error: a value of type "std::nullptr_t" cannot be used to initialize an entity of type "bool"
bool b2 = nullptr2;
if (nullptr){}; // warning: implicit conversion
if (nullptr2){};
};


Подробнее здесь: https://stackoverflow.com/questions/612 ... ation-work
Ответить

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

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

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

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

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