unique_ptr <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 में, कर्नेल रेंज में विहित संकेत ऊपरी बिट सेट है, यह जांचने के लिए एक (बेवकूफ हार्डकोड) तरीका हो सकता है कि क्या सूचक कर्नेल स्थान से संबंधित है - यदि नीचे दिया गया उत्तर सही है, तो नहीं ।
माइकल चौरडकिस

1
WINAPI p==-1में एक अमान्य हैंडल है। के बाद 2^64से एक हास्यास्पद बड़ी संख्या किसी भी समझदार pहमेशा सकारात्मक है। तो p<0WINAPI के अमान्य हैंडल के लिए जाँच करता है। यह अच्छा कोड नहीं है।
ALX23z

@OP: क्या आप थोड़ा स्पष्ट कर सकते हैं कि यह कोड किस संदर्भ में उपयोग किया गया है? क्या यह लिनक्स या विंडोज पर उपयोग किया जाता है? क्या पॉइंटर का मान किसी WINAPI कोड से संबंधित है? मुझे लगता है कि अगर आपने स्पष्ट किया है कि, ऊपर दी गई टिप्पणियाँ अच्छे उत्तर हो सकती हैं।
अखरोट

@ ALX23z लेकिन क्या एक WINAPI हैंडल प्रकार uint8_t*(या यहां तक ​​कि सरणी uint8_t) का होना चाहिए ? मुझे लगता है कि वे हैं void*, वे नहीं हैं?
अखरोट

@walnut वे नहीं void*हैं मैक्रो HANDLE_PTR या कुछ और जो मूल रूप से long*iirc है।
ALX23z

जवाबों:


2

unique_ptr <0 या ऑपरेटर से कम क्या करता है?

यह cppreference पर ओवरलोड (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है? मुझे लगता है कि वह क्या सोच रहा है। मुझे इससे कोई मतलब नहीं है, कम से कम।
18

@alteredinstance 0 को "माना नहीं" जाता है nullptr(या इस बात पर निर्भर करता है कि आपका क्या मतलब है)। 0 संक्षेप में करने के लिए धर्मान्तरित std::nullptr_t
एरोरिका

यही मैंने मान लिया। मैं सोच रहा हूँ अगर वहाँ के अंतर्निहित रूपांतरण पर कोई प्रलेखन 0है nullptr, क्योंकि मैंने केवल दो बूलियन तुलना के साथ संगत देखा है। वे तुलनीय हैं, लेकिन मैं इस धारणा के अधीन था कि वे परिवर्तनीय नहीं हैं।
alteredinstance

@alteredinstance रूपांतरण दूसरे तरीके से नहीं होता है। int x = nullptrबीमार है।
एरोरिका

2
@alteredinstance std::nullptr_tको किसी भी अशक्त सूचक स्थिरांक के साथ प्रयोग करने योग्य बनाया गया था; बस नहीं nullptr। 0 (साथ ही उदाहरण के लिए 0 एल) अशक्त सूचक स्थिरांक हैं, इसलिए यह इरादा है कि उनका उपयोग एक बनाने के लिए किया जा सकता है 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अधिकांश (सभी?) कार्यान्वयन पर वापस आएगा । @Eerorika
अखरोट

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सबसे अधिक (सभी?) वर्तमान कार्यान्वयन पर लौटता है ।
अखरोट

@wnut जब तक एक सवाल स्पष्ट रूप से नहीं पूछता कि मानक क्या कहता है ( उदाहरण के लिए भाषा-वकील टैग के माध्यम से ), मैं व्यावहारिक दृष्टिकोण से जवाब देने की कोशिश करता हूं। std::lessवापसी के सभी व्यावहारिक कार्यान्वयन false
YSC

यह ठीक है, मैंने अभी आपके तर्क को नहीं पाया (" as std :: less is a सख्त ऑर्डर फ़ाइक्टर ") पुष्ट। बिना लौटे यह एक सख्त आदेश हो सकता है false। व्यावहारिक कारण यह होगा कि शून्य पॉइंटर मान को सबसे कम संभव पते या उन रेखाओं के साथ कुछ द्वारा दर्शाया जाता है।
अखरोट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.