2016-06-08 10 views
22

ऐसा लगता है कि हम इस question में बताए गए स्थिर संग्रहण अवधि वाले ऑब्जेक्ट्स के रचनाकारों में सुरक्षित रूप से std::cout ऑब्जेक्ट का उपयोग कर सकते हैं।परिवर्तनीय टेम्पलेट्स और std :: cout - निर्माण का आदेश

हालांकि, मैं पूरी तरह से यकीन है कि हम सुरक्षित रूप से चर टेम्पलेट्स के मामले में उन्हें इस्तेमाल कर सकते हैं नहीं कर रहा हूँ:

#include <iostream> 

template<class T> 
T x = T{}; 

void foo() 
{ 
    class Test 
    { 
    public: 
     Test() { std::cout << "Test::Test\n"; } 
    }; 

    Test t = x<Test>; 
} 


int main() 
{ 
    std::cout << "main\n"; 
} 

बजना (live example) में इस कोड को दुर्घटनाओं और मुझे यकीन है कि क्या यह एक बग है या नहीं कर रहा हूँ नहीं।

+0

जीसीसी के साथ काम करता है। शायद यह झुकाव में एक बग है? – Cornstalks

+2

@ कॉर्नस्टॉक शायद। लेकिन शायद यह सिर्फ एक अनिश्चित व्यवहार है? – FrozenHeart

उत्तर

21

के रूप में, कि प्रश्न में समझाया

#include <iostream> 

में से एक प्रभाव एक वैश्विक चर को परिभाषित करने

static std::ios_base::Init __init; 

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

स्थिर भंडारण अवधि के साथ एक गैर-स्थानीय चर के गतिशील प्रारंभ अव्यवस्थित है चर एक है अगर:

हालांकि, स्पष्ट रूप से और परोक्ष instantiated टेम्पलेट विशेषज्ञताओं अव्यवस्थित प्रारंभ ([basic.start.dynamic]/1) है स्पष्ट रूप से या स्पष्ट रूप से तत्काल विशेषज्ञता, और अन्यथा आदेश दिया गया है [नोट] छोड़ दिया गया है। एक एकल अनुवाद इकाई के भीतर परिभाषित क्रमिक प्रारंभिकता वाले वेरिएबल को अनुवाद इकाई में उनकी परिभाषाओं के क्रम में प्रारंभ किया जाएगा।

और

के बाद से एक कार्यक्रम एक धागा शुरू होता है, तो एक चर के बाद अव्यवस्थित प्रारंभ हर दूसरे गतिशील आरंभीकरण के संबंध में unsequenced है। अन्यथा, एक चर का अनियंत्रित प्रारंभिक रूप से प्रत्येक अन्य गतिशील प्रारंभिकता के संबंध में अनुक्रमित किया गया है।

इस बात की कोई गारंटी नहीं है कि स्ट्रीम ऑब्जेक्ट्स को वैरिएबल टेम्पलेट विशेषज्ञता x<Test> प्रारंभ में शुरू किया गया है।

इस मामले में, संभावित निष्पादन में से एक के रूप में अपरिभाषित व्यवहार (स्ट्रीम ऑब्जेक्ट्स का उपयोग शुरू करने से पहले) का परिणाम होता है, पूरे कार्यक्रम का व्यवहार अपरिभाषित होता है ([intro.execution]/5 देखें)।

फिक्स Test के निर्माता में std::ios_base::Init ऑब्जेक्ट का निर्माण करना है।


यह वास्तव में चर टेम्पलेट्स के लिए underspecified है जब सी ++ 14 प्रकाशित किया गया था, लेकिन यह हमेशा मंशा हो गया है।

+0

तो उनके पास उन ऑब्जेक्ट्स के लिए भी अनियंत्रित प्रारंभिकरण है जो एक ही अनुवाद इकाई में परिभाषित हैं? – FrozenHeart

+2

@ फ्रोजनहेर्ट हां। वैसे भी विभिन्न टीयू के बीच कोई आदेश नहीं है। –

+0

बहुत बहुत धन्यवाद। अगला प्रश्न तब - http://stackoverflow.com/questions/37706549/stdcout-usage-in-constructors-of-objects-with-static-storage- अवधि – FrozenHeart

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