অনন্য_পিটি <0 বা অপারেটরের চেয়ে কম কি করে?


9

আমি এমন কোড নিয়ে কাজ করছি যা আমার দ্বারা লিখিত হয়নি। আমার এই বক্তব্য আছে:

// p is type of std::unique_ptr<uint8_t[]>
if (p < 0) { /* throw an exception */ }

সুতরাং p < 0এই প্রসঙ্গে মানে কি ?
উপর ডকুমেন্টেশন পৃষ্ঠাটিতে , আমার বিশ্বাস আমার ক্ষেত্রে দেখা যায় 16) y < nullptr, যেখানে 0হয় nullptr

কিন্তু এটা কি কাজ করে?


1
X64-এ, কার্নেল রেঞ্জের ক্যানোনিকাল পয়েন্টারগুলির উপরের বিট সেট রয়েছে তার উপর ভিত্তি করে, পয়েন্টারটি কার্নেলের সাথে সম্পর্কিত কিনা তা যাচাই করার (মূup় হার্ডকোডযুক্ত) উপায় হতে পারে - নীচের উত্তরটি সঠিক থাকলে, না ।
মাইকেল চৌর্দাকিস 18

1
WINAPI p==-1এ একটি অবৈধ হ্যান্ডেল। যেহেতু 2^64একটি হাস্যকর আকারে কোনও সংখ্যক বুদ্ধিমান pসর্বদা ইতিবাচক। সুতরাং p<0WINAPI এর অবৈধ হ্যান্ডেল পরীক্ষা করে। এটি ভাল কোড নয়।
ALX23z

@ ওপ: আপনি এই কোডটি কোন প্রসঙ্গে ব্যবহার করা হয়েছে তা কিছুটা পরিষ্কার করতে পারেন? এটি লিনাক্স বা উইন্ডোজ ব্যবহার করা হয়? পয়েন্টারের মান কিছু WINAPI কোডের সাথে সম্পর্কিত? আমি মনে করি আপনি যদি এটি স্পষ্ট করেন তবে উপরের মন্তব্যগুলি ভাল উত্তর হতে পারে।
আখরোট

@ ALX23z তবে একটি উইনাপি হ্যান্ডেলটি কি টাইপের uint8_t*(বা এমনকি অ্যারে uint8_t) হওয়া উচিত? আমি মনে করি তারা হয় void*, তাই না?
আখরোট

@ আখরোট এগুলি void*ম্যাক্রো HANDLE_PTR বা মূলত iirc কিছু আছে long*
ALX23z

উত্তর:


2

অনন্য_পিটি <0 বা অপারেটরের চেয়ে কম কি করে?

এটি cppreferences উপর ওভারলোড (11) এর সাথে মেলে operator<(const unique_ptr&, nullptr_t);। 0 স্পষ্টত রূপান্তরিত হয় std::nullptr_t। ডকুমেন্টেশন অনুযায়ী, ফলাফল std::less<unique_ptr<T,D>::pointer>()(x.get(), nullptr)

ফলাফল বাস্তবায়ন সংজ্ঞায়িত করা হয়, তবে সম্ভবত বেশিরভাগ সিস্টেমে নিঃশর্ত মিথ্যা। সম্ভবত একটি বহিরাগত সিস্টেম যেখানে নাল 0 এর বাইনারি উপস্থাপনা নেই, ফলাফল সত্য হতে পারে।

আমি বিশ্বাস করি আমার মামলা 16)

(16) একই অন্যান্য উপায় কাছাকাছি হল: 0 > unique_ptr। ফলাফল একই।


কিন্তু সংকলক দ্বারা 0বিবেচনা nullptrকরা হয়? আমার মনে হয় সেটাই ভাবছে। কমপক্ষে আমার কাছেও তা বোঝায় না।
পরিবর্তিত

@ এলটারডিনস্ট্যান্স 0 "বিবেচিত" নয় nullptr(বা বিবেচনা দ্বারা আপনি কী বোঝাতে চান তার উপর নির্ভর করে)। 0 স্পষ্টত রূপান্তরিত হয় std::nullptr_t
এরেরিকা

এটাই আমি ধরে নিয়েছি। যদি সেখানে অন্তর্নিহিত রূপান্তর কোন ডকুমেন্টেশন আমি হতাশ করছি 0করার nullptr, যেহেতু আমি মাত্র দুটি বুলিয়ান তুলনা সঙ্গে সামঞ্জস্যপূর্ণ দেখেছি। তারা তুলনীয়, তবে আমি এই ধারণার মধ্যে ছিলাম যে তারা রূপান্তরযোগ্য নয়।
পরিবর্তিত

টুইটারে রূপান্তরটি অন্যভাবে ঘটে না other int x = nullptrদুর্গঠিত
এরেরিকা

2
@ এলটারডিনস্ট্যান্স std::nullptr_tকোনও নাল পয়েন্টার ধ্রুবক সঙ্গে ব্যবহারযোগ্য হতে ডিজাইন করা হয়েছিল; না শুধু nullptr। 0 (পাশাপাশি 0L উদাহরণস্বরূপ) নাল পয়েন্টার ধ্রুবক, তাই এটি উদ্দেশ্য যে এগুলি তৈরি করতে ব্যবহার করা যেতে পারে std::nullptr_t
এরেরিকা

2

operator <আপনার কোড বেসের কোথাও ওভারলোড করা হয়নি তা পরীক্ষা করুন । এটি (p < 0)হতে পারে একমাত্র উপায় বলে মনে হচ্ছে true

উদাহরণ:

bool operator< (const std::unique_ptr<uint8_t[]>&, int) { return true; }

int main() {
    std::unique_ptr<uint8_t[]> p;
    std::cout << (p < 0) << std::endl;
}

ছাপে:

1

সরাসরি নমুনা

অন্যথায় যেমনটি বলেছেন, 0নিখুঁতভাবে রূপান্তর করে std::nullptr_t, যা bool operator<(const unique_ptr<T, D>& x, nullptr_t)ওভারলোড নির্বাচন করবে যা কল করবে std::less(p, 0)যা ফিরে আসবে false(এমনকি উইন্ডোতে -1পয়েন্টার মানের সাথে)।


এটি অগত্যা ফিরে আসে না false। এটি হয় বাস্তবায়ন-সংজ্ঞায়িত বা অনির্দিষ্ট (আমি নিশ্চিত নই।) তবে আমি সম্মত হই যে এটি সম্ভবত falseবেশিরভাগ (সমস্ত?) বাস্তবায়নে ফিরে আসবে । @ ইেরারিকার উত্তরও দেখুন
আখরোট

0

এই প্রকাশটি এই টেম্পলেট অপারেটরের সাথে মেলে (0 এ রূপান্তরিত হচ্ছে nullptr):

template <class T, class D>
bool operator<(const unique_ptr<T, D>& x, nullptr_t);

এটি প্রত্যাবর্তন করে std::less<unique_ptr<T,D>::pointer>()(p.get(), nullptr)যা সর্বদা মিথ্যা (যেমন std::lessএকটি কঠোর অর্ডার ফান্টেক্টর) ( ডেমো )।


এটি সর্বদা ফিরে আসে না false। এটি যা হয় বাস্তবায়ন-সংজ্ঞায়িত বা অনির্দিষ্ট। falseবেশিরভাগ (সব?) বর্তমান বাস্তবায়নে এটি সম্ভবত সর্বদা ফিরে আসে ।
আখরোট

@ ওয়ালনাট স্ট্যান্ডার্ড কী বলছে ( উদাহরণস্বরূপ ভাষা-আইনজীবী ট্যাগের মাধ্যমে) সম্পর্কে কোনও প্রশ্ন স্পষ্টভাবে জিজ্ঞাসা না করা পর্যন্ত আমি ব্যবহারিক দৃষ্টিকোণ থেকে উত্তর দেওয়ার চেষ্টা করি। সকল ব্যবহারিক বাস্তবায়ন std::lessআগমন false
ওয়াইএসসি

এটি ঠিক আছে, আমি আপনার যুক্তিটি খুঁজে পাইনি (" স্ট্যান্ডার্ড :: কম হ'ল একটি কঠোর অর্ডার ফান্টেক্টর ") বিশ্বাসযোগ্য। এটি ফিরে না এসে কড়া আদেশ হতে পারে false। ব্যবহারিক কারণটি হ'ল শূন্য পয়েন্টার মানটি সর্বনিম্ন সম্ভাব্য ঠিকানা বা lines লাইনগুলি বরাবর কিছু দ্বারা প্রতিনিধিত্ব করা হয়।
আখরোট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.