के रूप में, कि प्रश्न में समझाया
#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 प्रकाशित किया गया था, लेकिन यह हमेशा मंशा हो गया है।
स्रोत
2016-06-08 15:06:28
जीसीसी के साथ काम करता है। शायद यह झुकाव में एक बग है? – Cornstalks
@ कॉर्नस्टॉक शायद। लेकिन शायद यह सिर्फ एक अनिश्चित व्यवहार है? – FrozenHeart