2012-01-24 16 views
16

मैंने विजुअल स्टूडियो में एक जटिल त्रुटि के साथ एक अनोखा समय बिताया। मैंने कोड को छोटे संकलित उदाहरण में डिस्टिल्ड किया है और इसे IdeOne पर आज़माया है और उसी त्रुटि को मिला है जिसे आप here देख सकते हैं।यह कोड कॉपी कन्स्ट्रक्टर को कॉल करने का प्रयास क्यों कर रहा है?

मैं सोच रहा हूँ क्यों निम्नलिखित कोड B(B&&) के बजाय B(const B&) कॉल करने के लिए कोशिश करता है:

#include <iostream> 

using namespace std; 

class A { 
public: 
    A() : data(53) { } 
    A(A&& dying) : data(dying.data) { dying.data = 0; } 

    int data; 

private: 
    // not implemented, this is a noncopyable class 
    A(const A&); 
    A& operator=(const A&); 
}; 

class B : public A { }; 

int main() { 
    B binst; 

    char* buf = new char[sizeof(B)]; 

    B* bptr = new (buf) B(std::move(binst)); 

    cout << bptr->data << endl; 

    delete[] buf; 
} 

मैं स्पष्ट रूप से किसी भी कंस्ट्रक्टर्स को परिभाषित नहीं किया, इसलिए B(std::move(binst)) संकलक उत्पन्न B(B&&), कोई बुलाना चाहिए?

जब मैं बदल B

class B : public A { 
public: 
    B() { } 
    B(B&&) { } 
}; 

को यह ठीक संकलित करता है। ऐसा क्यों है?

यदि यह बेस क्लास से तय नहीं किया जा सकता है तो यह बेहद असुविधाजनक होगा क्योंकि मेरे पास एक टेम्पलेट क्लास है जो प्लेसमेंट को नया उपयोग करती है और उदाहरण के जैसे रचनाकारों को ले जाती है, और इसके लिए प्रत्येक वर्ग की आवश्यकता होगी जो प्रतिलिपि नहीं है (जो है स्पष्ट रूप से परिभाषित चाल कन्स्ट्रक्टर के लिए मेरे टेम्पलेट वर्ग के साथ उपयोग करने के लिए निश्चित रूप से आवश्यकता नहीं होनी चाहिए)।

+0

क्या कोई संकलक बी (बी एंड amp) उत्पन्न हुआ है? मेरा सी ++ 11 अभी भी थोड़ा जंगली है। और क्या आपके बी (बीएंडएक्स) को ए (ए और ए) शुरू करने की आवश्यकता होगी? – CashCow

+0

@CashCow हाँ, यह सब प्रत्येक सदस्य को स्थानांतरित करता है (यदि यह गलत है तो मैं आपको देख रहा हूं, केरेक एसबी ':)') –

+0

जीसीसी 4.6, जीसीसी 4.7 और क्लैंग 3.0 पर ठीक है। –

उत्तर

15

यदि आप विजुअल स्टूडियो 2010 या 2012 का उपयोग कर रहे हैं, तो सलाह दीजिये: संकलक स्वचालित रूप से आपके लिए चालक निर्माता उत्पन्न नहीं करता है। यह लागू नहीं किया गया था। तो आपको उन्हें खुद लिखना होगा।

+1

यह ध्यान दिया जाना चाहिए कि जब एक चालक कन्स्ट्रक्टर को डिफ़ॉल्ट रूप से परिभाषित किया जाना चाहिए, तो मानकीकरण प्रक्रिया के अंत के करीब बदल दिया गया है और vc2010 उसके आस-पास रहा है। इसके अलावा, vc2010 '= delete' का समर्थन नहीं करता है, जो चाल रचनाकारों के अनुरूपता के बारे में बात करना मुश्किल बनाता है :) – avakar

+0

यह गंभीर रूप से परेशान है। मैं वीएस 11 के लिए लंबा हूँ। धन्यवाद। –

+4

@ सेठ कार्नेगी: वीसी 11 स्वचालित रूप से कन्स्ट्रक्टर को स्थानांतरित नहीं करेगा ... http: //blogs.msdn।com/b/vcblog/archive/2011/09/12/10209291.aspx "रावल संदर्भ v3.0 स्वचालित रूप से चालकों को उत्पन्न करने के लिए नए नियम जोड़ता है और कुछ शर्तों के तहत असाइनमेंट ऑपरेटरों को स्थानांतरित करता है। यह वीसी 11 में लागू नहीं किया जाएगा, जो जारी रहेगा VC10 के व्यवहार का पालन करने के लिए कभी भी स्वचालित रूप से चालक कंट्रोलर्स/चाल असाइनमेंट ऑपरेटर उत्पन्न नहीं करते हैं। " –

5

आपको एक कंपाइलर बग का सामना करना होगा। मानक कहता है कि B एक निहित घोषित और परिभाषित चाल कन्स्ट्रक्टर प्राप्त करता है; 12.8 (9) की सभी शर्तों को पूरा किया जाता है (यानी B में स्पष्ट रूप से घोषित प्रतिलिपि निर्माता, कॉपी-असाइनमेंट आदि नहीं है, और चालक कन्स्ट्रक्टर को deleted घोषित नहीं किया जाएगा)।

+1

मुझे लगता है कि यह वीएस का उपयोग करने के लिए मिलता है, एक संकलक जो मानकों के बीच लिखा गया था। धन्यवाद। –

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