c++ क्या है "(getline(पंख, str)){}" सी++ 11 मानक के अनुरूप?




c++11 type-conversion (3)

दाऊद सही है, और यहां उसे वापस करने के लिए उद्धरण चिह्न हैं § 12.3.2 / 2 में, मानक कहते हैं

एक कनवर्ज़न फ़ंक्शन स्पष्ट (7.1.2) हो सकता है, उस स्थिति में इसे सीधे-इनिशियलाइज़ेशन (8.5) के लिए यूज़र-डिफ़ाइंड रूपांतरण के रूप में माना जाता है। अन्यथा, उपयोगकर्ता-निर्धारित रूपांतरणों को असाइनमेंट और प्रारंभिकताओं में उपयोग करने के लिए प्रतिबंधित नहीं किया जाता है। [ उदाहरण :

class Y { };
struct Z {
    explicit operator Y() const;
};

void h(Z z) {
    Y y1(z); // OK: direct-initialization
    Y y2 = z; // ill-formed: copy-initialization
    Y y3 = (Y)z; // OK: cast notation
}

- अंत उदाहरण ]

कुछ जगहों पर जहां यह प्रासंगिक रूपांतरण होता है, वह ऑपरेंड में होता है ! , ऑपरेटरों को && , और if एक की स्थिति

तो सीधे प्रारंभिकरण स्पष्ट रूपांतरण ऑपरेटर का उपयोग कर सकते हैं , और §4 / 3 में,

एक अभिव्यक्ति ई पर परस्पर रूप से एक प्रकार के T परिवर्तित किया जा सकता है अगर और केवल तभी घोषित T t=e; कुछ आविष्कृत अस्थायी चर (8.5) के लिए अच्छी तरह से बनाई गई है। कुछ भाषा निर्माणों की आवश्यकता होती है कि अभिव्यक्ति को बूलियन मान में परिवर्तित किया जाए। इस तरह के संदर्भ में दिखने वाला एक अभिव्यक्ति ईमानदारी से बूल में रूपांतरित हो जाता है और अगर और केवल अगर घोषणा bool t(e); कुछ आविष्कृत अस्थायी चर (8.5) के लिए अच्छी तरह से बनाई गई है ...

जैसा कि आप देख सकते हैं, मानक निर्दिष्ट करता है- जैसे सांकेतिक रूपांतरण के लिए प्रत्यक्ष प्रारंभिकरण, इसलिए यही है कि स्पष्ट परिस्थितियां if परिस्थितियों में होती हैं

मैंने सी ++ 11 मानक की जांच की और निम्नलिखित तथ्यों को पाया:

  1. std::getline(fin, str) एक basic_ios ऑब्जेक्ट देता है, जिनकी कक्षा में एक सदस्य फ़ंक्शन explicit operator bool() const;

  2. कक्षा के basic_ios सदस्य फ़ंक्शन operator void*() const; प्री-सी ++ 11 के रूप में

तो, मुझे लगता है if (getline(fin, str)) {} मानक अनुरूप नहीं है। इसे इस रूप में लिखा जाना चाहिए

if (bool(getline(fin, str)){} । (हालांकि, वीसी ++ 2012 इस प्रयोग पर एक चेतावनी देता है, अर्थात् बल void * को bool)

क्या मैं सही हूँ?


explicit operator bool (और केवल explicit operator bool ) की विशेष भाषा है जो इसे कुछ खास परिस्थितियों में निहित रूप से एक bool में परिवर्तित करने की अनुमति देती है। इस कनवर्ज़न के लिए विनिर्देश भाषा " bool रूपांतरित हो गई है"।

ये उन जगहें हैं जहां भाषा बूलियन परीक्षण करती है। if/while/for प्रयोग किया जाता सशर्त अभिव्यक्ति है "प्रासंगिक रूप से bool परिवर्तित" जैसे तार्किक ऑपरेटरों और सशर्त ऑपरेटर ( ?: :) हैं।

इसलिए जब आप ये नहीं कर सकते:

bool b = std::getline(fin, str);
void func(bool) {}
func(std::getline(fin, str));

आप ये कर सकते हैं:

while(std::getline(fin, str)) {...}
for(;std::getline(fin, str);) {...}
if(std::getline(fin, str) && somethingElse) {...}

कोड अनुरूप है। स्पष्ट रूपांतरण ऑपरेटर को बुलाया जाएगा जब ऑब्जेक्ट को एक शर्त के रूप में प्रयोग किया जाता है मानक में परिवर्तन उस समान उपयोग को बनाए रखने के लिए किया गया था, जबकि यह थोड़ा सुरक्षित बना रहा था।





explicit-conversion