मैं अभी थोड़ा और विवरण जोड़ूंगा। एक अंतर्निहित सरणी std::initializer_listअस्थायी रूप से इसी तरह का व्यवहार करती है। निम्नलिखित वर्ग पर विचार करें:
struct X
{
X(int i) { std::cerr << "ctor\n"; }
~X() { std::cerr << "dtor\n"; }
};
और निम्नलिखित कोड में इसका उपयोग:
std::pair<const X&, int> p(1, 2);
std::cerr << "barrier\n";
यह प्रिंट करता है
ctor
dtor
barrier
चूंकि पहली पंक्ति में, प्रकार Xका एक अस्थायी उदाहरण बनाया जाता है (निर्माणकर्ता से परिवर्तित करके 1) और साथ ही नष्ट हो जाता है। में संग्रहीत संदर्भ pतो झूल रहा है।
जैसे std::initializer_list, यदि आप इसे इस तरह से उपयोग करते हैं:
{
std::initializer_list<X> l { 1, 2 };
std::cerr << "barrier\n";
}
तब तक, अंतर्निहित (अस्थायी) सरणी लंबे समय से lबाहर निकलती है। इसलिए, आउटपुट है:
ctor
ctor
barrier
dtor
dtor
हालाँकि, यदि आप स्विच करते हैं
std::pair<std::initializer_list<X>, int> l { {1}, 2 };
std::cerr << "barrier\n";
आउटपुट फिर से है
ctor
dtor
barrier
चूंकि अंतर्निहित (अस्थायी) सरणी केवल पहली पंक्ति में मौजूद है। तत्पश्चात के तत्वों को पॉइंफ्रेंसिंग को अपरिभाषित करने के lपरिणामस्वरूप अपरिभाषित व्यवहार होता है।
लाइव डेमो यहाँ है ।
std::pair।