আমি কীভাবে nullptr
কাজ করে তা জানতে আগ্রহী । N4659 এবং N4849 স্ট্যান্ডার্ডগুলি বলে:
- এটি টাইপ করতে হবে
std::nullptr_t
; - আপনি এর ঠিকানা নিতে পারবেন না;
- এটি সরাসরি পয়েন্টার এবং পয়েন্টারে সদস্যতে রূপান্তরিত হতে পারে;
sizeof(std::nullptr_t) == sizeof(void*)
;- এর রূপান্তর
bool
হয়false
; - এর মানটি অবিচ্ছেদ্য ধরণের রূপে রূপান্তরিত হতে পারে
(void*)0
তবে পিছনে নয়;
সুতরাং এটি মূলত একই ধরণের অর্থ সহ ধ্রুবক (void*)0
তবে এটির একটি আলাদা ধরণ রয়েছে। আমি std::nullptr_t
আমার ডিভাইসে বাস্তবায়ন পেয়েছি এবং এটি নীচে রয়েছে।
#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 <class _Tp>
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
operator _Tp* () const {return 0;}
template <class _Tp, class _Up>
_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
যদিও আমি প্রথম অংশে আরও আগ্রহী। এটি 1-5 পয়েন্টগুলি সন্তুষ্ট বলে মনে হচ্ছে, তবে কেন এটির একটি সাবক্লাস __nat এবং এর সাথে সম্পর্কিত সমস্ত কিছুই আমার জানা নেই। আমি এটিও জানতে চাই কেন এটি অবিচ্ছেদ্য রূপান্তরগুলিতে ব্যর্থ হয়।
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 <class _Tp>
constexpr
operator _Tp* () const {return 0;}
template <class _Tp, class _Up>
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<long>(nullptr);
long l2 = reinterpret_cast<long>(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){};
};
#ifdef _LIBCPP_HAS_NO_NULLPTR
। সংকলকটি যখন সরবরাহ করে না তখন এটি সর্বোত্তম-প্রচেষ্টা মতো মনে হয় nullptr
।
nullptr_t
এটি একটি মৌলিক প্রকার। এটিকে শ্রেণীর ধরণের হিসাবে প্রয়োগ করা কার্যকরভাবে বাস্তবায়ন করে না। খ্রিস্টের মন্তব্য দেখুন।
is_class
এবং is_null_pointer
উভয়ই একই ধরণের জন্য সত্য হতে পারে না। শুধুমাত্র প্রাথমিক ধরণের বিভাগের ফাংশনগুলির মধ্যে একটি নির্দিষ্ট ধরণের জন্য সত্য ফিরে আসতে পারে।
nullptr_t
একটি মৌলিক ধরনের। কীভাবেint
বাস্তবায়ন হয়?