2012-06-05 17 views
7

संभव डुप्लिकेट निजी कॉपी पहुंच सकता है:
Can objects with private copy constructors be thrown?वी.एस. संकलक ctor

मुझे पता है के रूप में, जब आप मूल्य के रूप में वस्तु trow, प्रतिलिपि बनाई जानी चाहिए। तो अगर मौजूद है तो कन्स्ट्रक्टर को कॉपी किया जाना चाहिए। अगर प्रतिलिपि ctor मौजूद है और निजी है तो यह संकलन त्रुटि का कारण बनना चाहिए। यहां कोड नमूना

class Exception { 
public: 
Exception() { 
    cout << "Exception()" << endl; 
} 

~Exception() { 
    cout << "~Exception() " << endl; 
} 
private: 
Exception(const Exception &c) { 
     cout << "Exception(c)" << endl; 
    } 
}; 

और अगला कोड संकलन त्रुटि का कारण बनना चाहिए।

try { 
     Exception local; 

     throw local; 
    } catch (...) { 
    } 

लेकिन वीएस 2005 और वीएस 2008 दोनों में सफलतापूर्वक उस कोड को संकलित करें और निजी सीटीओ को कॉल करें। क्या मुझे गलत है कि यह गैर मानक व्यवहार है और संकलक में एक त्रुटि है?

+0

मैंने बहुत जल्द बात की। http://ideone.com/hXrJd –

+2

@ एशन: वीएस प्रमुख लोगों के बीच सबसे खराब मानक-अनुरूप सी ++ कंपाइलर होता था (जीसीसी, आईसीसी, आओ, इत्यादि ..)। इसके समर्थकों का कहना है कि अब यह बहुत बेहतर है, व्यक्तिगत रूप से मैंने इसका उपयोग बंद कर दिया है। –

उत्तर

0

मैं यहां एक अंग पर बाहर जा रहा हूं और कहूंगा कि यह शायद एक वैध एमएसवीसी 10 बग है। हालांकि, इसके लिए मुझे कोई संदर्भ नहीं मिल रहा है। - प्रति निर्माता private है और वर्ग के संदर्भ से बाहर से बुलाया जा रहा है

#include <cstdlib> 
#include <string> 
#include <iostream> 
#include <iomanip> 
using namespace std; 

class Exception { 
public: 
Exception() { 
    cout << "Exception()" << endl; 
} 

~Exception() { 
    cout << "~Exception() " << endl; 
} 
private: 
Exception(const Exception &c) { 
     cout << "Exception(c)" << endl; 
    } 
}; 

int main() 
{ 
    try { 
     Exception local; 

     int n = 42; 

     throw local; 
    } catch (...) 
    { 
    } 
} 

इस कोड को कारण आप ध्यान दें के लिए संकलित करने के लिए असफल चाहिए:

यहाँ एक परीक्षण दोहन है।

यह कोड एमएसवीसी 10 और एमएसवीसी 11 देव पूर्वावलोकन में सफलतापूर्वक संकलित करता है। RHEL6.2 तहत

जीसीसी 4.4.4 का उत्सर्जन करता है:

[[email protected] ~]$ gcc --version 
gcc (GCC) 4.4.4 20100726 (Red Hat 4.4.4-13) 
Copyright (C) 2010 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
[[email protected] ~]$ gcc hack.cpp 
hack.cpp: In function ‘int main()’: 
hack.cpp:17: error: ‘Exception::Exception(const Exception&)’ is private 
hack.cpp:29: error: within this context 
[[email protected] ~]$ 
0

मानक का कहना है कि एक अपवाद है क्योंकि फेंक एक प्रति बना सकते हैं copyable होना चाहिए। आपने कॉपी कन्स्ट्रक्टर को निजी बना दिया है, इसलिए इसे संकलित नहीं करना चाहिए।

हालांकि यह नहीं बताता है फेंक के कार्यान्वयन है कि आवश्यक प्रतिलिपि बनाने के लिए - वास्तव में, यह elided जा सकता है या में सी ++ 11 भी ले जाया गया। इसलिए हालांकि एमएसवीसी को इस आधार पर कोड को संकलित करने से इंकार कर देना चाहिए कि यह मानक-अनुरूप नहीं है, यह अभी भी करता है, क्योंकि यह एमएसवीसी के काम करने के तरीके के साथ काम करेगा।

यह एक बग की संभावना नहीं है, बल्कि मानक के साथ वीसी का एक मामला नहीं है।

+0

गैर-अनुपालन * नहीं * एक बग कैसे हो रहा है? –

+1

@MarkB मुझे लगता है कि यह एक बग को परिभाषित करने के तरीके पर निर्भर करता है। यहां, मैं इस बात का जिक्र कर रहा हूं कि यह माइक्रोसॉफ्ट के हिस्से पर जानबूझकर लगता है। अनुभव से बात करते हुए यह वास्तव में ऐसी चीज है जो वे "लापरवाही" पर होंगी। –

+1

मानक स्पष्ट रूप से बताता है कि जब प्रतियां elided हैं तब भी प्रतिलिपि निर्माता उपलब्ध और सुलभ होना चाहिए। मैं इस व्यवहार को गैर-बग के रूप में समझने का कोई तरीका नहीं देख सकता। –

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