2011-12-02 4 views
11

एक प्रकार bar किस प्रकार bar के संदर्भ के लिए रूपांतरण ऑपरेटरों उपयोगकर्ता परिभाषित किया गया है पर विचार करें? इसके अलावा, अगर यह ऑपरेटर deleted थे तो इसका क्या अर्थ है? क्या सुविधा का कोई दिलचस्प उपयोग है?किस प्रकार के परिचालन ऑपरेटर को खुद ही बुलाया जाएगा?</p> <pre><code>struct bar { operator bar &(); operator const bar &() const; }; </code></pre> <p>जब ये रूपांतरण से लागू होगा:

निम्नलिखित कार्यक्रम या तो रूपांतरण लागू करने के लिए प्रकट नहीं होता है:

#include <iostream> 

struct bar 
{ 
    operator bar &() 
    { 
    std::cout << "operator bar &()" << std::endl; 
    return *this; 
    } 

    operator const bar &() const 
    { 
    std::cout << "operator const bar &() const" << std::endl; 
    return *this; 
    } 
}; 

void foo(bar x) 
{ 
} 

int main() 
{ 
    bar x; 

    bar y = x;   // copy, no conversion 

    y = x;    // assignment, no conversion 

    foo(x);   // copy, no conversion 

    y = (bar&)x;  // no output 

    y = (const bar&)x; // no output 

    return 0; 
} 

उत्तर

9

सी ++ 11 §12.3.2

एक रूपांतरण समारोह (संभवत: सीवी-योग्य) (संभवतः सीवी-योग्य) एक ही ऑब्जेक्ट प्रकार के लिए ऑब्जेक्ट (या के लिए एक संदर्भ कन्वर्ट करने के लिए इस्तेमाल कभी नहीं किया है यह), एक (संभवतः सीवी-योग्य) है कि प्रकार (या इसे करने के लिए एक संदर्भ) के आधार वर्ग के लिए, या (संभवतः सीवी-योग्य) शून्य

+0

ऐसा लगता है कि एक कंपाइलर तब एक उपयोगी चेतावनी उत्सर्जित कर सकता है। –

+1

धन्यवाद। कोई विचार है कि मुझे ऐसे कार्यों को परिभाषित करने की अनुमति क्यों है यदि उनका कभी भी उपयोग नहीं किया जा सकता है? –

1

मैं किसी भी कारण है कि यह कभी कहा जाता है नहीं देख सकता। रूपांतरण कार्यों को ... कनवर्ट करने के लिए कहा जाता है। यदि आपके पास पहले से सही प्रकार है, तो प्रतिलिपि से पहले रूपांतरण ऑपरेशन जोड़ने का कोई कारण नहीं है।

+0

शायद: 'संरचना टी {ऑपरेटर टी एंड() कॉन्स; }; टी सीटी = टी(), और आर 1 = सीटी, और आर 2 = टी(); ' – curiousguy

2

विशेषता यह है कि आप एक रूपांतरण समारोह को परिभाषित करने के लिए अनुमति दी जाती है एक प्रकार से स्वयं तक, लेकिन रूपांतरण फ़ंक्शन का कभी भी उपयोग नहीं किया जाता है, टेम्पलेट प्रोग्रामिंग में एक उपयोगी सुविधा हो सकती है, जहां दो प्रकार के पैरामीटर एस को संदर्भित कर सकते हैं या नहीं तात्कालिकता के आधार पर, एमई प्रकार। मेरा कुछ कोड इस सुविधा पर निर्भर करता है। यह उन मामलों के लिए विशेषज्ञता प्रदान करने के लिए बचाता है जहां दो या दो से अधिक प्रकार के पैरामीटर एक ही प्रकार का जिक्र करते हैं।

0

बस रिकॉर्ड के लिए। मैं इस तरह की संरचना को एक बड़े सॉफ्टवेयर प्रोजेक्ट में बनाने में कामयाब रहा, अंधाधुंध संकलक चेतावनी पर भरोसा किया और "कभी भी प्रयुक्त विधि" को हटा दिया। खैर, मुझे लगता है कि मुझे एक परिदृश्य मिला जहां इसे वास्तव में बुलाया जाता है। कंपाइलर बेस क्लास को याद करता है।

#include <iostream> 

struct D; 
struct B 
{ 
    virtual operator D&() 
    { 
     throw "foo"; 
    } 
}; 

struct D : public B 
{ 
    virtual operator D&() 
    { 
     std::cout << "bar" << std::endl; 
     return *this; 
    } 
}; 

int main() 
{ 
    B* b = new D(); 
    D& d = *b; 

    return 0; 
} 
संबंधित मुद्दे