2011-10-24 5 views
5

में एसडीडी डेक/वेक्टर के बीच अलग-अलग व्यवहार मेरे पास कोड का यह बहुत आसान टुकड़ा है;एमएसवीसीसी/जी ++/आईसीसी

#include <deque> 
#include <vector> 

using namespace std; 

class A 
{ 
public: 
    A(){}; 
    ~A(){}; 
    deque<A> my_array; // vector<A> my_array; 
}; 

int main(void) 
{ 
} 

अगर मैं के साथ इस कोड संकलन दोनों जी ++ और आईसीसी/icpc लिनक्स पर यह ठीक संकलित, यहां तक ​​कि -Wall साथ यह कोई चेतावनी देता है। अगर मैं एक वेक्टर के लिए डेक स्वैप करता हूं तो स्थिति वही होती है।

मैं MSVCC (सीएल) का उपयोग कर खिड़कियों पर इस कोड का निर्माण करना चाहते हैं लेकिन दुर्भाग्य से यह त्रुटि c2027 फेंकता है:

error C2027: use of undefined type 'A' 

यदि फिर भी मैं बदल std::deque एक std::vector के लिए यह दृश्य स्टूडियो 2010

के साथ ठीक संकलित

मेरा प्रश्न है; क्या इस व्यवहार की किसी कारण से उम्मीद की जा सकती है? यदि हां, तो कंपाइलर्स के बीच मतभेद क्यों हैं या क्या यह g ++/icc या MSVCC के साथ कोई गलती है?

उत्तर

12

यह अपरिभाषित व्यवहार (दोनों std::deque साथ और std::vector साथ है, इसलिए जो कुछ भी एक कार्यान्वयन यह ठीक है, जहाँ तक मानक संबंध है। आप एक अधूरी प्रकार के साथ एक मानक कंटेनर instantiating रहे हैं के साथ करता है।

जब जी के साथ संकलन ++, -Wall (और सामान्य में, सभी विकल्पों को -W साथ शुरू) केवल चिंता भाषा। पुस्तकालय मुद्दों के लिए, आप -D_GLIBCXX_CONCEPT_CHECKS -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC रूप में अच्छी तरह से संकलन होना चाहिए। (इस प्रदर्शन समस्याओं का कारण बनता है, तो आप निकाल सकते हैं अंतिम टी ऑप्टिमाइज्ड बिल्ड में -D।)

+0

+1, हालांकि, मैं केवल 'डेक' के साथ यूबी होने की उम्मीद कर रहा था। – iammilind

+0

"जो भी कार्यान्वयन करता है वह ठीक है, जहां तक ​​मानक का संबंध है" - एक अनुरूप कार्यान्वयन इसे संकलित करने में असफल नहीं होना चाहिए क्योंकि इसमें व्यवहार को अपरिभाषित नहीं किया गया है। यद्यपि यह निश्चित रूप से निदान दे सकता है, और एक कार्यान्वयन मोड में कार्यान्वयन कर सकता है, जहां वे निदान केवल चेतावनियां ही अस्पष्ट हो सकती हैं। –

+0

@SteveJessop मानक (§1.3.12) में _undefined व्यवहार_ की परिभाषा स्पष्ट रूप से कहती है "जिसके लिए यह अंतर्राष्ट्रीय मानक ** कोई ** आवश्यकताएं लागू नहीं करता है" (एम्फिसिस जोड़ा गया)। और नोट के तुरंत बाद, यह "[...] को ** अनुवाद ** या निष्पादन को समाप्त करने के लिए देता है ( डायग्नोस्टिक संदेश जारी करने के साथ)" कार्यान्वयन के उदाहरण के उदाहरण के रूप में। –

0

जेम्स कानज़ के उत्तर के आगे मैंने खोज की और this Dr Dobbs article पाया जो अपूर्ण प्रकार वाले कंटेनर का उपयोग करने के मानक के रुख को बताता है।

आगे यह संकेत देता है कि यह vector एस के साथ काम करता है लेकिन deque एस, अर्थात् कार्यान्वयन नहीं है। एक ठेठ वेक्टर की तरह

class vector<T> { 
    T* buff; 
    int size; 
    // ... snip 
}; 

जो कुछ imcomplete प्रकार के साथ ठीक है क्योंकि हम T को केवल एक सूचक लेकिन deque अच्छी तरह से इस तरह से लागू किया जा सकता (VS2010 में) है कि यह मूल्य द्वारा T का उपयोग करता है हो सकता है इस प्रकार यह अपूर्ण प्रकारों के साथ असंगत प्रस्तुत करता है।

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

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