2015-09-25 4 views
18

में 'डिफ़ॉल्ट' कीवर्ड को संभालने में संभावित बग VS2015 C++ कंपाइलर का परीक्षण करते समय मैंने default कीवर्ड के साथ एक अजीब बग पर ठोकर खाई। अगर मैं कार्य करें:वीएस2015 सी ++

struct Dummy 
{ 
    Dummy() = default; 
    Dummy(const Dummy &) = delete; 
}; 

int main() 
{ 
    const Dummy& ref = Dummy(); 
    return 0; 
} 

मैं

त्रुटि C2280: 'डमी :: डमी (स्थिरांक डमी &)': किसी हटाए समारोह
टिप्पणी को संदर्भित करने का प्रयास कर रहा: 'डमी की घोषणा देखें: : डमी '

लेकिन अगर मैं एक खाली निर्माता का उपयोग

struct Dummy 
{ 
    Dummy() {} 
    Dummy(const Dummy &) = delete; 
}; 

int main() 
{ 
    const Dummy& ref = Dummy(); 
    return 0; 
} 

कोड संकलित करता है। g++ या clang के साथ पहला उदाहरण चलाना कोई त्रुटि नहीं उत्पन्न करता है।

वीएस2015 के साथ डिफ़ॉल्ट कन्स्ट्रक्टर का उपयोग क्यों कॉपी कन्स्ट्रक्टर का उपयोग करने का प्रयास करेगा जहां यह g ++ या clang में नहीं है?

+0

आप 'कॉन्स डमी एंड आर 2 {डमी()} से क्या प्राप्त करते हैं; '? –

+0

संबंधित: [स्पष्ट रूप से हटाए गए प्रतिलिपि/चालक कन्स्ट्रक्टर बनाम elision को कॉपी/स्थानांतरित करें] (http: // stackoverflow।कॉम/प्रश्न/20589622) –

+0

कृपया यह http://stackoverflow.com/questions/31264984/c-compiler-error-c2280-attempting-to-reference-a-deleted-function-in-visual –

उत्तर

9

यह निश्चित रूप से स्थिरांक संदर्भ के लिए अस्थायी प्रतिलिपि निर्माता फोन नहीं चाहिए बताए वी.एस. 2015

में एक बग सी ++ 11 में है, लेकिन वी.एस. 2015 है।

आप

#include <iostream> 

struct Dummy 
{ 
    Dummy() = default; 
    Dummy(const Dummy &) { std::cout << "copy ctor" << std::endl; } 
    void test() const { std::cout << "test" << std::endl; } 
}; 

int main() 
{ 
    const Dummy& ref = Dummy(); 
    ref.test(); 
    return 0; 
} 

वी.एस. 2013 2015, जीसीसी और बजना पर संकलित के साथ देख सकते हैं। केवल वीएस (कोई संस्करण) कॉपी कन्स्ट्रक्टर को कॉल करता है, अगर क्लास कन्स्ट्रक्टर = default के रूप में परिभाषित किया गया है।

प्रारंभकर्ता अभिव्यक्ति एक rvalue है, तो टी 2 एक साथ:

मैं 2015 में वी.एस. compiiler अभी भी ग़लती से इस बात के लिए पुराने सी ++ 03 मानक नियम (सी ++ 03 की 8.5.3.5) का उपयोग करता है लगता है वर्ग प्रकार, और "CV1 T1" संदर्भ-संगत के साथ "CV2 टी 2," संदर्भ निम्न तरीकों में से एक में ही है है (चुनाव कार्यान्वयन परिभाषित किया गया है):

- संदर्भ के लिए बाध्य है उस वस्तु के भीतर रावल्यू (3.10 देखें) या उप-ऑब्जेक्ट द्वारा प्रतिनिधित्व वस्तु।

- प्रकार का एक अस्थायी "सीवी 1 टी 2" [एसआईसी] बनाया गया है, और एक कन्स्ट्रक्टर को पूरे रावल्यू ऑब्जेक्ट को अस्थायी रूप में कॉपी करने के लिए बुलाया जाता है। संदर्भ अस्थायी के भीतर अस्थायी या उप-ऑब्जेक्ट से जुड़ा हुआ है।

प्रतिलिपि बनाने के लिए उपयोग किए जाने वाले निर्माता को कॉल किया जाएगा या नहीं, वास्तव में प्रतिलिपि बनाई गई है या नहीं।

वीएस डेवलपर्स ने दूसरा रास्ता चुना। उन्होंने इसे खाली उपयोगकर्ता परिभाषित कन्स्ट्रक्टर ({}) के लिए सही किया, लेकिन डिफ़ॉल्ट रूप से (= default) रचनाकारों के लिए ऐसा करना भूल गया।

पीएस। Bug on MS Connect (कृपया वोट दें)

+0

एसटीएल का उत्तर: https://twitter.com/StephanTLavavej/status/648949525684465664 – vladon

संबंधित मुद्दे