2015-10-18 9 views
10

अस्थायी A(3) को "यहां" मुद्रित होने से पहले नष्ट नहीं किया जाना चाहिए?"यहां" मुद्रित होने से पहले अस्थायी ए (3) को नष्ट नहीं किया जाना चाहिए?

#include <iostream> 
struct A 
{ 
    int a; 
    A() { std::cout << "A()" << std::endl; } 
    A(int a) : a(a) { std::cout << "A(" << a << ")" << std::endl; } 
    ~A() { std::cout << "~A() " << a << '\n'; } 
}; 

int main() 
{ 
    A a[2] = { A(1), A(2) }, A(3); 
    std::cout << "Here" << '\n'; 
} 

आउटपुट:

A(1) 
A(2) 
A(3) 
Here 
~A() 3 
~A() 2 
~A() 1 

Live example

+3

नहीं है, विनाशकर्ता जैसे ही वस्तु क्षेत्र से बाहर हो जाता है के रूप में पैदा किया जा रहा है (यानी, जब मुख्य के ''} तक पहुँच जाता है)। – 101010

+0

@ 101010 घोषणापत्र के अंत में अस्थायी रूप से नष्ट नहीं किया गया है 'ए [2] = {ए (1), ए (2)}, ए (3); '? –

उत्तर

13

A(3) एक अस्थायी वस्तु नहीं है, लेकिन प्रकार A का एक उद्देश्य A कहा जाता है। यह वही तर्क है:

A a[2] = { A(1), A(2) }, a2(3); 

मुझे वास्तव में पता नहीं था कि आपको ऐसा करने की अनुमति है।

+1

आप इसे कर सकते हैं, लेकिन आपके द्वारा किए जाने के बाद, आपको 'ए' को 'स्ट्रक्चर ए' के ​​रूप में संदर्भित करना होगा क्योंकि केवल 'ए' संदिग्ध होगा। – SHR

5

@ नील-कर्क के जबाब कारण A(3) एक अस्थायी नहीं है करने के लिए एक विस्तार के रूप कि मूल लाइन

A a[2] = { A(1), A(2) }, A(3); 

वास्तव में दो चर a[] और A

A a[2] = { A(1), A(2) }; 
A A(3); 

की एक आशुलिपि घोषणा है आप कैसे कर सकते हैं

int a = 1, b = 2; 

या

int a = 1; 
int b = 2; 
संबंधित मुद्दे

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