নালপটার ঠিক কী?


570

আমাদের কাছে এখন অনেকগুলি নতুন বৈশিষ্ট্য সহ সি ++ 11 রয়েছে। একটি আকর্ষণীয় এবং বিভ্রান্তিকর এক (আমার জন্য অন্তত) নতুন nullptr

আচ্ছা, বাজে ম্যাক্রোর আর দরকার নেই NULL

int* x = nullptr;
myclass* obj = nullptr;

এখনও, আমি কিভাবে nullptrকাজ করে না। উদাহরণস্বরূপ, উইকিপিডিয়া নিবন্ধ বলেছেন:

সি ++ 11 একটি বিশিষ্ট নাল পয়েন্টার ধ্রুবক: নাল্পটার হিসাবে পরিবেশন করার জন্য একটি নতুন কীওয়ার্ড প্রবর্তন করে এটিকে সংশোধন করে । এটি nullptr_t প্রকারের , যা স্পষ্টভাবে রূপান্তরযোগ্য এবং কোনও পয়েন্টার টাইপ বা পয়েন্টার-থেকে-সদস্য প্রকারের সাথে তুলনীয়। এটি সুস্পষ্টভাবে রূপান্তরযোগ্য বা বুল ব্যতীত অবিচ্ছেদ্য ধরণের সাথে তুলনীয় নয়।

এটি কীওয়ার্ড এবং কোনও ধরণের উদাহরণ?

এছাড়াও, আপনার কি আরও একটি উদাহরণ রয়েছে (উইকিপিডিয়াটির পাশে) যেখানে nullptrভাল পুরানো তার চেয়ে উচ্চতর 0?


23
সম্পর্কিত তথ্য: nullptrসি ++ / সিএলআই-তে পরিচালিত হ্যান্ডলগুলির নাল রেফারেন্স উপস্থাপন করতেও ব্যবহৃত হয়।
মেহরদাদ আফশারি

3
ভিজ্যুয়াল সি ++ ব্যবহার করার সময় মনে রাখবেন যে আপনি যদি সিটি / সি ++ কোডের সাথে নালপ্টার ব্যবহার করেন এবং তারপরে / ক্লার সংকলক বিকল্পটি সংকলন করেন তবে সংকলকটি নির্ধারণ করতে পারে না যে নালপ্টার কোনও স্থানীয় বা পরিচালিত নাল পয়েন্টার মান নির্দেশ করে কিনা। আপনার উদ্দেশ্যটি সংকলকের কাছে পরিষ্কার করার জন্য, একটি পরিচালিত মান নির্দিষ্ট করতে নলপ্টার বা একটি স্থানীয় মান নির্দিষ্ট করতে __nullptr ব্যবহার করুন। মাইক্রোসফ্ট একটি উপাদান এক্সটেনশন হিসাবে এটি প্রয়োগ করেছে।
সিডার

6
হয় nullptr_t, শুধুমাত্র এক সদস্য আছে নিশ্চিত nullptr? সুতরাং, যদি কোনও ফাংশন ফিরে আসে nullptr_t, তবে সংকলকটি ইতিমধ্যে জানে কোন ফাংশনটির শরীর বিবেচনা না করে কোন মানটি ফিরে আসবে?
অ্যারন ম্যাকডেইড

8
@ অ্যারোনম্যাকডেইড std::nullptr_tতাত্ক্ষণিকভাবে ব্যবহার করা যেতে পারে, তবে সমস্ত উদাহরণ একরকম হবে nullptrকারণ প্রকারটি সংজ্ঞায়িত করা হয়েছে typedef decltype(nullptr) nullptr_t। আমি বিশ্বাস করি যে প্রকারটি বিদ্যমান থাকার প্রাথমিক কারণটি nullptrযদি প্রয়োজন হয় তবে ফাংশনগুলি বিশেষত ধরা পড়ার জন্য বিশেষভাবে ওভারলোড করা যায় । একটি উদাহরণের জন্য এখানে দেখুন ।
জাস্টিন সময় - মনিকা

5
0 কখনই নাল পয়েন্টার ছিল না, নাল পয়েন্টারটি পয়েন্টার যা পয়েন্টার টাইপের শূন্য আক্ষরিক কাস্টিং দ্বারা পাওয়া যেতে পারে , এবং এটি সংজ্ঞা অনুসারে কোনও বিদ্যমান বস্তুতে নির্দেশ করে না ।
সুইফ্ট - শুক্রবার পাই

উত্তর:


403

এটি কীওয়ার্ড এবং কোনও ধরণের উদাহরণ?

এটি আশ্চর্যজনক নয়। উভয় trueএবং falseকীওয়ার্ড এবং আক্ষরিক হিসাবে তাদের টাইপ রয়েছে ( bool)। nullptrএটি টাইপের একটি নির্দেশক আক্ষরিকstd::nullptr_t , এবং এটি একটি মূল্য (আপনি এটি ব্যবহার করে এর ঠিকানা নিতে পারবেন না &)।

  • 4.10পয়েন্টার রূপান্তর সম্পর্কে বলে যে প্রকারের std::nullptr_tমূল্য একটি নাল পয়েন্টার ধ্রুবক এবং একটি অবিচ্ছেদ্য নাল পয়েন্টার ধ্রুবকে রূপান্তর করা যায় std::nullptr_t। বিপরীত দিকটি অনুমোদিত নয়। এটি উভয় পয়েন্টার এবং পূর্ণসংখ্যার জন্য একটি ফাংশন ওভারলোডিং এবং nullptrপয়েন্টার সংস্করণ নির্বাচন করতে পাস করার অনুমতি দেয়। পাসিং NULLবা 0বিভ্রান্তিমূলকভাবে intসংস্করণটি নির্বাচন করবে ।

  • nullptr_tইন্টিগ্রাল টাইপের কাস্টের জন্য একটি দরকার reinterpret_cast, এবং একটি ইন্টিগ্রাল টাইপের ক্যাপ হিসাবে একই শব্দার্থক থাকে (void*)0(ম্যাপিং বাস্তবায়ন সংজ্ঞায়িত)। এ কোনও পয়েন্টার ধরণের reinterpret_castরূপান্তর nullptr_tকরতে পারে না । যদি সম্ভব হয় বা ব্যবহার করা হয় তবে অন্তর্ভুক্ত রূপান্তরটির উপর নির্ভর করুন static_cast

  • স্ট্যান্ডার্ডটির এটি sizeof(nullptr_t)হওয়া দরকার sizeof(void*)


ওহ, দেখার পরে আমার কাছে মনে হচ্ছে শর্তসাপেক্ষ অপারেটর 0 এর মতো ক্ষেত্রে 0 টি নালপ্টারে রূপান্তর করতে পারে না cond ? nullptr : 0;। আমার উত্তর থেকে সরানো হয়েছে।
জোহানেস স্কাউব -

88
নোট যে NULLএমনকি গ্যারান্টিযুক্ত হয় না 0। এটি হতে পারে 0L, এক ক্ষেত্রে কলটি void f(int); void f(char *);দ্বিধাগ্রস্থ হবে। nullptrসর্বদা পয়েন্টার সংস্করণটিকে সমর্থন করবে এবং কখনই সেটিকে কল করবে না int। এছাড়াও মনে রাখবেন nullptr হয় থেকে পরিবর্তনীয় bool(খসড়া যে বলছেন 4.12)।
জোহানেস স্কাউব -

@ লিটব: সুতরাং চ (ইনট) এবং এফ (অকার্যকর *) সম্পর্কিত - চ (0) এখনও দ্ব্যর্থক হবে?
স্টিভ ফলি

27
@ স্টিভ, intসংস্করণটি কল করবে না । তবে f(0L)অস্পষ্ট, কারণ long -> intপাশাপাশি long -> void*উভয়ই সমান ব্যয়বহুল। সুতরাং যদি এনইউএলএল 0Lআপনার সংকলকটিতে থাকে, তবে f(NULL)এই দুটি ফাংশন প্রদত্ত কলটি দ্বিধাবিভক্ত হবে। nullptrঅবশ্যই তাই না ।
জোহানেস স্কাউব -

2
@ স্পেনস এটি (void*)0সি ++ এর মতো সংজ্ঞায়িত করা উচিত নয় । তবে এটি যে কোনও নির্বিচার নাল পয়েন্টার ধ্রুবক হিসাবে সংজ্ঞায়িত করা যেতে পারে, যা মান 0 এবং nullptrপূর্ণতা সহ কোনও অবিচ্ছেদ্য ধ্রুবক । সুতরাং, সবচেয়ে স্পষ্টভাবে না হবে কিন্তু যা করতে পারেন । (আপনি আমাকে BTW ping করতে ভুলে গেছি ..)
Deduplicator

60

নালপ্ট্রার থেকে : একটি টাইপ-নিরাপদ এবং ক্লিয়ার-কাট নাল পয়েন্টার :

নতুন সি ++ ০৯ নলপ্টার কীওয়ার্ডটি একটি মূল্যবোধের ধ্রুবককে ডিজাইন করে যা সর্বজনীন নাল পয়েন্টার আক্ষরিক হিসাবে কাজ করে, বগি এবং দুর্বল-টাইপযুক্ত আক্ষরিক 0 এবং কুখ্যাত নুল ম্যাক্রোর প্রতিস্থাপন করে। নাল্প্টার এইভাবে 30 বছরেরও বেশি বিব্রতবোধ, অস্পষ্টতা এবং বাগগুলি শেষ করে দেয়। নিম্নলিখিত বিভাগগুলি নালপ্টারের সুবিধা উপস্থাপন করে এবং দেখায় যে এটি কীভাবে NUL এবং 0 এর অসুস্থতাগুলি নিরাময় করতে পারে।

অন্যান্য উল্লেখ:


17
সি ++ 09? এটি আগস্ট ২০১১ এর আগে C ++ 0x হিসাবে উল্লেখ করা হয়নি?
মাইকেল ডারস্ট

2
@ অ্যানথ্রোপমোরফিক ভাল এটি এর উদ্দেশ্য। সি ++ 0 এক্স ব্যবহার করা চলাকালীন এটি এখনও কাজ চলছিল, কারণ এটি 2008 বা 2009 শেষ হবে কিনা তা জানা যায়নি Note মনে রাখবেন যে এটি আসলে সি ++ 0 বি হয়ে গেছে যার অর্থ সি ++ 11। দেখুন stroustrup.com/C++11FAQ.html
mxmlnkn

44

সি ++ 11 এ নালপ্ট্রার কেন? এটা কি? নুল কেন পর্যাপ্ত নয়?

সি ++ বিশেষজ্ঞ অ্যালেক্স অ্যালাইন একেবারে এখানে বলেছেন (আমার জোরটি সাহসের সাথে যুক্ত হয়েছে):

... কল্পনা করুন আপনার নীচের দুটি ফাংশন ঘোষণা রয়েছে:

void func(int n); 
void func(char *s);

func( NULL ); // guess which function gets called?

যদিও দেখে মনে হচ্ছে দ্বিতীয় ফাংশনটি ডাকা হবে - আপনি হচ্ছেন, পয়েন্টার বলে মনে হচ্ছে এমনটি যাচ্ছেন - এটি সত্যই প্রথম ফাংশন যা বলা হবে! সমস্যাটি হ'ল যেহেতু NULL 0, এবং 0 একটি পূর্ণসংখ্যা, তার পরিবর্তে ফানকের প্রথম সংস্করণটি ডাকা হবে। হ্যাঁ, এটি সর্বদা ঘটে না, তবে এটি যখন ঘটে তখন তা অত্যন্ত হতাশাব্যঞ্জক এবং বিভ্রান্তিকর। কী চলছে তার বিবরণ যদি আপনি না জানতেন তবে এটি একটি সংকলক বাগের মতো দেখতে ভাল লাগবে। সংকলক বাগের মতো দেখতে এমন একটি ভাষা বৈশিষ্ট্য হ'ল, আপনি চান এমন কিছু নয়।

নাল্পটার প্রবেশ করান। সি ++ ১১-এ, নলপ্ট্রার একটি নতুন কীওয়ার্ড যা নুল পয়েন্টার উপস্থাপন করতে ব্যবহার করা যেতে পারে (এবং হওয়া উচিত!); অন্য কথায়, আপনি যেখানে আগে নুল লিখছিলেন সেখানে আপনার পরিবর্তে নাল্পটার ব্যবহার করা উচিত। প্রোগ্রামার , এটি আপনার কাছে আরও স্পষ্ট নয় (সংকলকটির অর্থ প্রত্যেকেই জানে), তবে এটি সংকলকটির কাছে আরও স্পষ্ট , যা পয়েন্টার হিসাবে ব্যবহার করার সময় 0 এর দশকে আর বিশেষ অর্থ হিসাবে ব্যবহৃত হবে না।

আল্লায়েন তার নিবন্ধটি এর সাথে শেষ করেছেন:

এগুলি যাই হোক না কেন - সি ++ 11 এর জন্য থাম্বের নিয়মটি nullptrযখনই আপনি অন্যথায় NULLঅতীতে ব্যবহার করতেন কেবল তখনই ব্যবহার শুরু করা ।

(আমার কথা):

শেষ অবধি, nullptrএটি একটি বিষয় - একটি শ্রেণি ভুলবেন না । এটা তোলে যে কোন জায়গায় ব্যবহার করা যাবে NULLসামনে ব্যবহৃত হয়, কিন্তু আপনি যদি কোনো কারণে তার টাইপ প্রয়োজন, এটা ধরনের সঙ্গে নিষ্কাশিত হতে পারে decltype(nullptr), অথবা সরাসরি হিসাবে বর্ণনা std::nullptr_tকেবল একটি যা, typedefএর decltype(nullptr)

তথ্যসূত্র:

  1. Cprogramming.com: সি ++ 11 এ আরও ভাল প্রকারের - নলপ্টর, এনাম ক্লাস (দৃ strongly়ভাবে টাইপযুক্ত গণনা) এবং সিএসটিডিন্ট
  2. https://en.cppreference.com/w/cpp/language/decltype
  3. https://en.cppreference.com/w/cpp/types/nullptr_t

2
আমি অবশ্যই বলতে পারি আপনার উত্তরটি নিম্নরূপিত হয়েছে, এটি আপনার উদাহরণের মাধ্যমে বোঝা খুব সহজ ছিল।
এমএসএস

37

যখন আপনার কোনও ফাংশন থাকে যা একাধিক ধরণের পয়েন্টার গ্রহণ করতে পারে তখন এটিকে কল NULLকরা অস্পষ্ট। এটি এখন যেভাবে কাজ করা হয়েছে তা কোনও ইনট গ্রহণ করে এবং ধরে নিলে এটি খুব হ্যাকি NULL

template <class T>
class ptr {
    T* p_;
    public:
        ptr(T* p) : p_(p) {}

        template <class U>
        ptr(U* u) : p_(dynamic_cast<T*>(u)) { }

        // Without this ptr<T> p(NULL) would be ambiguous
        ptr(int null) : p_(NULL)  { assert(null == NULL); }
};

ইন C++11আপনার উপর জমিদার করতে সক্ষম হবে nullptr_t, যাতে ptr<T> p(42);একটি কম্পাইল-টাইম এরর বদলে রান সময় হবে assert

ptr(std::nullptr_t) : p_(nullptr)  {  }

NULLসংজ্ঞায়িত হলে কী হবে 0L?
এলএফ

9

nullptrএকটি ইন্টিগ্রাল টাইপ যেমন একটি intকেবলমাত্র পয়েন্টার টাইপ হিসাবে বরাদ্দ করা যায় না ; হয় অন্তর্নির্মিত পয়েন্টার টাইপ যেমন int *ptrবা স্মার্ট পয়েন্টার যেমনstd::shared_ptr<T>

আমি বিশ্বাস করি এটি একটি গুরুত্বপূর্ণ পার্থক্য কারণ NULLএখনও NULLম্যাক্রো প্রসারিত হিসাবে একটি অবিচ্ছেদ্য প্রকার এবং একটি পয়েন্টার উভয়কেই নির্ধারিত করা যেতে পারে 0যা intএকটি পয়েন্টারের পাশাপাশি প্রাথমিক মান উভয় হিসাবে পরিবেশন করতে পারে ।


মনে রাখবেন যে এই উত্তরটি ভুল। NULLএর প্রসারিত হওয়ার নিশ্চয়তা নেই 0
এলএফ

6

এছাড়াও, আপনার কি আরও একটি উদাহরণ রয়েছে (উইকিপিডিয়াটির পাশে) যেখানে nullptrভাল পুরানো 0 এর চেয়ে উচ্চতর?

হ্যাঁ. এটি একটি (সরলীকৃত) বাস্তব-বিশ্বের উদাহরণ যা আমাদের উত্পাদন কোডে ঘটেছিল। এটি কেবলমাত্র বাইরে দাঁড়িয়েছিল কারণ বিভিন্ন রেজিস্টার প্রস্থ সহ প্ল্যাটফর্মের ক্রসকম্পিং করার সময় জিসিসি সতর্কতা জারি করতে সক্ষম হয়েছিল (কেবলমাত্র x86_64 থেকে x86 পর্যন্ত ক্রসকম্পলিং করার সময় ঠিক ঠিক নিশ্চিত নয় warning: converting to non-pointer type 'int' from NULL):

এই কোডটি বিবেচনা করুন (সি ++ 03):

#include <iostream>

struct B {};

struct A
{
    operator B*() {return 0;}
    operator bool() {return true;}
};

int main()
{
    A a;
    B* pb = 0;
    typedef void* null_ptr_t;
    null_ptr_t null = 0;

    std::cout << "(a == pb): " << (a == pb) << std::endl;
    std::cout << "(a == 0): " << (a == 0) << std::endl; // no warning
    std::cout << "(a == NULL): " << (a == NULL) << std::endl; // warns sometimes
    std::cout << "(a == null): " << (a == null) << std::endl;
}

এটি এই আউটপুট দেয়:

(a == pb): 1
(a == 0): 0
(a == NULL): 0
(a == null): 1

নালপ্ট্রার (এবং সি ++ 11) ব্যবহার করার পরে এটি কীভাবে উন্নতি হয় তা দেখতে আমি ব্যর্থ। যদি আপনি নালপ্ট্রারে পিবি সেট করেন তবে প্রথম তুলনাটি এখনও সত্য (যদি নাশপাতিগুলির সাথে আপেলের তুলনা করা হয়) মূল্যায়ন করে। দ্বিতীয় কেসটি আরও খারাপ: আপনি যদি একটিকে নাল্প্টারের সাথে তুলনা করেন তবে এটি একটিকে বি * তে রূপান্তরিত করবে এবং তারপরে এটি আবার সত্যতে মূল্যায়ন করবে (এটি বুল হয়ে গেছে এবং এক্সপ্রেসকে মিথ্যা হিসাবে মূল্যায়ন করার আগে)। পুরো জিনিসটি আমাকে জাভাস্ক্রিপ্টের কথা মনে করিয়ে দেয় এবং আমি ভাবছি যে আমরা ভবিষ্যতে সি ++ তে === পাব কিনা :(
নিলস

5

ঠিক আছে, অন্যান্য ভাষাগুলিতে সুরক্ষিত শব্দ রয়েছে যা প্রকারের উদাহরণ। পাইথন, উদাহরণস্বরূপ:

>>> None = 5
  File "<stdin>", line 1
SyntaxError: assignment to None
>>> type(None)
<type 'NoneType'>

এটি আসলে একটি মোটামুটি ঘনিষ্ঠ তুলনা কারণ Noneসাধারণত সাধারণত এমন কোনও কিছুর জন্য ব্যবহৃত হয় যা অন্তর্নিহিত হয়নি, তবে একই সাথে তুলনা যেমন None == 0মিথ্যা।

অন্যদিকে, সাদামাটা সিতে, NULL == 0সত্যিকারের আইআরসি ফিরে আসবে কারণ NULL0 কেবলমাত্র একটি ম্যাক্রোই প্রত্যাবর্তন করছে, যা সর্বদা একটি অবৈধ ঠিকানা (এএফাইক)।


4
NULLএকটি ম্যাক্রো যা শূন্যে প্রসারিত হয়, একটি পয়েন্টারে ধ্রুবক শূন্য কাস্ট একটি নাল পয়েন্টার তৈরি করে। একটি নাল পয়েন্টার শূন্য হতে হবে না (তবে প্রায়শই হয়), শূন্য সর্বদা একটি অবৈধ ঠিকানা নয়, এবং একটি পয়েন্টারটিতে অ ধ্রুবক শূন্য নিক্ষিপ্ত হওয়া আবশ্যক নয়, এবং একটি নাল পয়েন্টার একটিতে নিক্ষিপ্ত হবে পূর্ণসংখ্যা শূন্য হতে হবে না। আমি আশা করি কিছু না ভুলেই ঠিক হয়ে গেলাম। একটি রেফারেন্স: c-faq.com/null/null2.html
স্যামুয়েল এডউইন ওয়ার্ড

3

এটি একটি কীওয়ার্ড কারণ মানকটি এটির মতো নির্দিষ্ট করে দেবে। ;-) সর্বশেষ সর্বজনীন খসড়া অনুসারে (n2914)

2.14.7 পয়েন্টার আক্ষরিক [lex.nullptr]

pointer-literal:
nullptr

পয়েন্টার আক্ষরিক কিওয়ার্ড nullptr। এটি টাইপের একটি মূল্যায়ন std::nullptr_t

এটি কার্যকর কারণ এটি সুস্পষ্টভাবে একটি অবিচ্ছেদ্য মান রূপান্তর করে না।


2

ধরা যাক যে আপনার একটি ফাংশন রয়েছে (চ) যা ইনট এবং চর * উভয়ই নিতে ওভারলোড হয় ed সি ++ ১১ এর আগে, আপনি যদি একে নাল পয়েন্টার দিয়ে কল করতে চেয়েছিলেন এবং আপনি NULL (অর্থাত্ মান 0) ব্যবহার করেন, তবে আপনি ইনভারের জন্য ওভারলোড হওয়াটিকে কল করবেন:

void f(int);
void f(char*);

void g() 
{
  f(0); // Calls f(int).
  f(NULL); // Equals to f(0). Calls f(int).
}

এটি সম্ভবত আপনি যা চেয়েছিলেন তা নয়। সি ++ 11 নালপ্টারের সাহায্যে এটি সমাধান করে; এখন আপনি নিম্নলিখিত লিখতে পারেন:

void g()
{
  f(nullptr); //calls f(char*)
}

1

প্রথমে আপনাকে অসম্পূর্ণ একটি বাস্তবায়ন দিতে দিন nullptr_t

struct nullptr_t 
{
    void operator&() const = delete;  // Can't take address of nullptr

    template<class T>
    inline operator T*() const { return 0; }

    template<class C, class T>
    inline operator T C::*() const { return 0; }
};

nullptr_t nullptr;

nullptrরিটার্ন টাইপ রেজোলভার আইডিয়মের একটি সূক্ষ্ম উদাহরণ যা সঠিকভাবে নির্ধারণ করা হয় তার ধরণের উপর নির্ভর করে সঠিক টাইপের একটি নাল পয়েন্টার কেটে নেওয়া।

int *ptr = nullptr;                // OK
void (C::*method_ptr)() = nullptr; // OK
  • আপনি উপরে যেমন করতে পারেন, যখন nullptrকোনও পূর্ণসংখ্যার পয়েন্টারকে বরাদ্দ করা হয় , তখন intটেমপ্ল্লেটেড রূপান্তর ফাংশনের একটি টাইপ ইনস্ট্যান্টেশন তৈরি হয়। এবং একই পদ্ধতি পয়েন্টার জন্য যায়।
  • এইভাবে টেমপ্লেটের কার্যকারিতাটি উপকারের মাধ্যমে আমরা প্রতিটি সময়ই উপযুক্ত ধরণের নাল পয়েন্টার তৈরি করে থাকি, একটি নতুন ধরণের অ্যাসাইনমেন্ট।
  • nullptrমান শূন্য সহ একটি পূর্ণসংখ্যার আক্ষরিক হিসাবে , আপনি মুছে ফেলা এবং অপারেটর দ্বারা আমরা সম্পন্ন এটির ঠিকানাটি ব্যবহার করতে সক্ষম হবেন না।

কেন nullptrআমাদের প্রথম স্থানে দরকার?

  • আপনি দেখতে পাচ্ছেন traditional NULLতিহ্যবাহী এর সাথে নীচে কিছু সমস্যা রয়েছে:

1- অন্তর্নিহিত রূপান্তর

char *str = NULL; // Implicit conversion from void * to char *
int i = NULL;     // OK, but `i` is not pointer type

2- কল্পনা অস্পষ্টতা

void func(int) {}
void func(int*){}
void func(bool){}

func(NULL);     // Which one to call?
  • সংকলন নিম্নলিখিত ত্রুটি উত্পাদন করে:
error: call to 'func' is ambiguous
    func(NULL);
    ^~~~
note: candidate function void func(bool){}
                              ^
note: candidate function void func(int*){}
                              ^
note: candidate function void func(int){}
                              ^
1 error generated.
compiler exit status 1

3️⃣ কনস্ট্রাক্টর ওভারলোড

struct String
{
    String(uint32_t)    {   /* size of string */    }
    String(const char*) {       /* string */        }
};

String s1( NULL );
String s2( 5 );
  • এই জাতীয় ক্ষেত্রে, আপনার স্পষ্টরূপে castালাই প্রয়োজন (যেমন  String s((char*)0)),।

0

0 কেবলমাত্র পূর্ণসংখ্যার মান হিসাবে ব্যবহৃত হত যা পয়েন্টারগুলির জন্য castালাই-মুক্ত প্রারম্ভিক হিসাবে ব্যবহার করা যেতে পারে: আপনি castালাই ছাড়াই অন্য পূর্ণসংখ্যার মানগুলির সাথে পয়েন্টারগুলি আরম্ভ করতে পারবেন না। আপনি 0 কে একটি পূর্ণসংখ্যার আক্ষরিকের মতো সিনট্যাকটিকালি অনুরূপভাবে একটি প্রসেক্সপ্রস সিঙ্গলটন হিসাবে বিবেচনা করতে পারেন। এটি কোনও পয়েন্টার বা পূর্ণসংখ্যার সূচনা করতে পারে। তবে আশ্চর্যের বিষয় হল, আপনি দেখতে পাবেন যে এর কোনও স্বতন্ত্র প্রকার নেই: এটি একটি int। সুতরাং কিভাবে 0 পয়েন্টার আরম্ভ করতে পারে 1 এবং করতে পারে না? একটি ব্যবহারিক উত্তর ছিল আমাদের পয়েন্টার নাল মান সংজ্ঞায়নের একটি মাধ্যম প্রয়োজন এবং intএকটি পয়েন্টারের সরাসরি সংক্রামিত রূপান্তরটি হ'ল ত্রুটি-প্রবণ। সুতরাং 0 প্রাগৈতিহাসিক যুগের বাইরে একটি বাস্তব অদ্ভুত অদ্ভুত প্রাণীতে পরিণত হয়েছিল। nullptrপয়েন্টারগুলিকে আরম্ভ করার জন্য নাল মানটির একটি আসল সিঙ্গলটন কনস্টেক্সপ্রের প্রতিনিধিত্ব করার প্রস্তাব দেওয়া হয়েছিল। এটি সরাসরি সংখ্যার সূচনা করার জন্য ব্যবহার করা যাবে না এবং NULL0 এর সাথে সংজ্ঞায়নের সাথে জড়িত অস্পষ্টতাগুলি দূর nullptrকরতে স্ট্যান্ড সিনট্যাক্স ব্যবহার করে গ্রন্থাগার হিসাবে সংজ্ঞায়িত করা যেতে পারে তবে শব্দার্থগতভাবে এটি একটি অনুপস্থিত মূল উপাদান হিসাবে দেখা যায়। কিছু লাইব্রেরি এটিকে সংজ্ঞায়িত করার সিদ্ধান্ত না NULLনিলে এখন তার পক্ষে nullptrঅবহিত করা হয় nullptr


-1

এখানে এলএলভিএম শিরোনাম।

// -*- C++ -*-
//===--------------------------- __nullptr --------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef _LIBCPP_NULLPTR
#define _LIBCPP_NULLPTR

#include <__config>

#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
#pragma GCC system_header
#endif

#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

#endif  // _LIBCPP_NULLPTR

(দ্রুততার সাথে একটি মহান বিষয় উন্মোচিত করা যেতে পারে grep -r /usr/include/*`)

যে জিনিসটি ঝাঁপিয়ে পড়েছিল তা হ'ল অপারেটর *ওভারলোড (0 ফিরে আসা সেগফাল্টিংয়ের চেয়ে অনেক বেশি বন্ধুত্বপূর্ণ ...)। আরেকটা জিনিস এটা একটি ঠিকানা সংরক্ষণ সঙ্গে সামঞ্জস্যপূর্ণ দেখাচ্ছে না হয় এ সব । এটি কীভাবে শূন্যতার ঝুঁকিতে পড়ে এবং নূন্য ফলাফলকে প্রেরণাল মান হিসাবে সাধারণ পয়েন্টারে পৌঁছে দেয় তার সাথে তুলনা করলে স্পষ্টতই "কখনই ভুলে যাবেন না, এটি একটি বোমা হতে পারে" ফ্যাক্টর হ্রাস করবে।


-2

NULL 0 হওয়ার দরকার নেই যতক্ষণ আপনি সর্বদা NULL এবং কখনও 0 ব্যবহার করেন না, NULL এর কোনও মান হতে পারে। আপনি ফ্ল্যাট মেমরি সহ একটি ভন নিউম্যান মাইক্রোকন্ট্রোলার হিসাবে কর্মসূচী হিসাবে বিবেচনা করছেন, এটির 0 টির মধ্যে বিঘ্নিত ভেক্টর রয়েছে N যদি NULL কে 1024 বলতে দেওয়া হয় এবং 1024-তে কোনও সংরক্ষিত ভেরিয়েবল থাকে তবে লেখাটি ক্রাশ হবে না এবং আপনি প্রোগ্রামের অভ্যন্তর থেকে NULL পয়েন্টার অ্যাসাইনমেন্ট সনাক্ত করতে পারবেন। এটি পিসিগুলিতে অর্থহীন, তবে স্থান অনুসন্ধান, সামরিক বা চিকিত্সা সরঞ্জামগুলির জন্য ক্রাশ না হওয়া গুরুত্বপূর্ণ।


2
ঠিক আছে, মেমরিতে নাল পয়েন্টারটির আসল মান শূন্য নাও হতে পারে, তবে সি (এবং সি ++) স্ট্যান্ডার্ড ম্যান্ডেটগুলি সংকলকগুলি অবিচ্ছেদ্য 0 আক্ষরিককে নাল পয়েন্টারে রূপান্তর করতে পারে ilers
bzim
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.