2015-12-14 2 views
26

ग्लोबल नेम स्पेस में निम्नलिखित घोषणा को देखते हुए:स्थिर स्थिरांक चर के स्व-प्रारंभिकरण, क्या यह अच्छी तरह से गठित है?

constexpr int x = x; 

इस अच्छी तरह से गठित है?

मसौदा सी ++ 14 मानक खंड 3.6.2[basic.start.init] का कहना है:

स्थिर भंडारण अवधि (3.7.1) या धागा भंडारण अवधि (3.7.2) के साथ चर करेगा किसी अन्य प्रारंभिक होने से पहले शून्य-प्रारंभिक (8.5) बनें। [...]

क्या उदाहरण अच्छी तरह से परिभाषित करने के लिए लगता है कि x निरंतर आरंभीकरण जो 0 कारण शून्य प्रारंभ करने के लिए किया जाएगा के दौरान अपनी ही मूल्य के साथ आरंभ नहीं हो जाता है।

क्या यह वास्तव में मामला है? बजना accepts this code जबकि gcc produces a diagnostic:

error: the value of 'x' is not usable in a constant expression 
constexpr int x = x; 
       ^
+2

यह कभी अपरिभाषित व्यवहार नहीं है। –

+0

@ टी.सी. जब मैंने यूबी का उल्लेख किया, तो मैं [इस मामले] के बारे में सोच रहा था (http://stackoverflow.com/q/14935722/1708801) और संबंधित [सी ++ 14 संस्करण यहां] (http://stackoverflow.com/q/ 23415661/1708801)। मैंने मूल रूप से उन्हें प्रश्न में संदर्भित किया था लेकिन ऐसा लगा कि यह कम स्पष्ट हो गया था। –

+3

निश्चित रूप से, लेकिन इस संदर्भ में, कुछ भी जो यूबी होगा निरंतर अभिव्यक्ति नहीं है, इसके बजाय आरंभिकता को खराब बना दिया गया है। –

उत्तर

23

यह स्पष्ट किया गया था और defect report 2026: Zero-initialization and constexpr से बीमार का गठन कर दिया है जो पूछता है:

3.6.2 [basic.start.init] पैरा 2,

के अनुसार

स्थिर भंडारण अवधि (3.7.1 [basic.stc.static]) या थ्रेड स्टोरेज अवधि (3.7.2 [basic.stc.thread]) के साथ वेरिएबल्स शून्य-प्रारंभिक होंगे (8.5 [dcl.init]) किसी भी अन्य प्रारंभिक होने से पहले।

क्या यह निरंतर प्रारंभिकरण पर भी लागू होता है? उदाहरण के लिए, को निम्न आरंभिक होना चाहिए, अनुमानित निरंतर प्रारंभ से पहले शून्य-प्रारंभिकता पर निर्भर होना चाहिए?

constexpr int i = i; 
struct s { 
    constexpr s() : v(v) { } 
    int v; 
}; 
constexpr s s1; 

टिप्पणी प्रस्तावित संकल्प से पहले का कहना है:

राष्ट्रमंडल खेलों पर सहमत हुए कि लगातार प्रारंभ, इन मामलों में शून्य आरंभीकरण के बजाय हो रहा बनाने घोषणाओं बीमार गठन के रूप में माना जाना चाहिए।

और प्रस्तावित संकल्प स्पष्ट और कई परिवर्तन के बीच, निम्नलिखित शब्दों निकालता है:

स्थिर भंडारण अवधि (3.7.1) या धागा भंडारण अवधि (3.7.2) के साथ चर शून्य होगा प्रारंभिक (8.5) किसी अन्य प्रारंभिक होने से पहले शुरू किया गया। [...]

और निम्नलिखित शब्दों को जोड़ता है: लगातार प्रारंभ नहीं किया जाता है

हैं, स्थिर भंडारण अवधि (3.7.1 [basic.stc साथ एक चर।स्थैतिक]) या थ्रेड स्टोरेज अवधि (3.7.2 [basic.stc.thread]) शून्य-प्रारंभिक (8.5 [dcl.init]) है। [...]

यह एक बड़े परिवर्तन, यह [basic.start.init][basic.start.static] को और एक नया खंड बनाया [basic.start.dynamic का नाम बदलता है ] और संशोधित करता है [stmt.dcl]

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

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