मैं अभी थोड़ा और विवरण जोड़ूंगा। एक अंतर्निहित सरणी 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
।