यह डिफॉल्ट कंस्ट्रक्टर को क्यों कहता है?


80
struct X
{
    X()    { std::cout << "X()\n";    }
    X(int) { std::cout << "X(int)\n"; }
};

const int answer = 42;

int main()
{
    X(answer);
}

मुझे उम्मीद है कि यह या तो प्रिंट होगा

  • X(int), क्योंकि X(answer);से या के intलिए एक डाली के रूप में व्याख्या की जा सकती हैX
  • कुछ भी नहीं, क्योंकि X(answer);एक चर की घोषणा के रूप में व्याख्या की जा सकती है।

हालांकि, यह प्रिंट करता हैX() , और मुझे नहीं पता कि क्यों X(answer);डिफ़ॉल्ट निर्माता को कॉल करेगा।

बोनस अंक: एक परिवर्तनीय घोषणा के बजाय अस्थायी पाने के लिए मुझे क्या बदलना होगा?


1
एक्स ((इंट) उत्तर); हालाँकि सही परिणाम उत्पन्न करता है।
inisheer

2
@JTA और अंत में, X(int(answer));कुछ भी प्रिंट नहीं करता है, क्योंकि यह एक फ़ंक्शन घोषणा है :)
fredoverflow

1
कुछ भी नहीं, क्योंकि एक्स (उत्तर); एक चर की घोषणा के रूप में व्याख्या की जा सकती है। यह घोषणा भी एक परिभाषा होगी, और यह डिफ़ॉल्ट कंस्ट्रक्टर के निष्पादन को ट्रिगर करती है ... जिसका अर्थ है कि आपने अपने प्रश्न का उत्तर दिया है।
डेविड रॉड्रिग्ज - 15

6
@ double(expresso);वहाँ जाओ तुम जाओ, सिर्फ तुम्हारे लिए घोषित;)
fredoverflow

2
@FredOverflow: मुझे इसका उपयोग करने के लिए एक परिभाषा की आवश्यकता है , क्योंकि मैं कोई प्रभाव महसूस नहीं कर रहा हूं ...
डेविड रॉड्रिग्ज - dribeas

जवाबों:


73

कुछ भी नहीं, क्योंकि एक्स (उत्तर); एक चर की घोषणा के रूप में व्याख्या की जा सकती है।

आपका जवाब यहां छिपा है। यदि आप एक चर घोषित करते हैं, तो आप इसके डिफ़ॉल्ट ctor (यदि गैर-पीओडी और उस सभी सामान) को लागू करते हैं।

अपने संपादन पर: एक अस्थायी पाने के लिए, आपके पास कुछ विकल्प हैं:


4
static_cast<X>(answer)यह भी एक पुराने से अनुशंसा की जाती है - "सबसे सी ++" जवाब लगता है जीसीसी प्रलेखन एक तरह से एक rvalue के लिए मजबूर करने के रूप में।
केरेक एसबी

ब्रेस इनिशलाइज़र भी शायद एक कॉपी नहीं होगा?
रुबेंब जुब

@rubenvb: ऐसा क्यों होगा? यह सिर्फ कहने का एक नया तरीका है X(answer)और एक ctor कॉल की गारंटी देता है।
Xeo

@ Xeo: क्योंकि ब्रेस इनिशियलाइज़र सिंटैक्स मूल्य द्वारा अपने तर्क लेता है? (<- प्रश्न चिह्न पर ध्यान दें)
१६:५० पर रुबेंव

4
@KerrekSB लेकिन निश्चित रूप से केवल C ++ 11 से पहले, नहीं? अब, विहित उत्तर होगा X{answer}
कोनराड रुडोल्फ


9

यदि आप X का एक प्रकार घोषित करना चाहते हैं, तो आपको इसे इस तरह करना चाहिए:

X y(answer);

1
उन्होंने यह नहीं पूछा कि इसे कैसे कॉल किया जाए X(int)
Xio

हाँ, लेकिन मुझे एक छोटा सा अहसास है कि यह वह चीज़ है जो वह करने के लिए तैयार है :)
huysentruitw

6
@WouterH: वास्तव में, फ्रेड को जानते हुए, यह संभावना नहीं है। वह उन लोगों में से एक है जो सी ++ मानक के अंधेरे कोनों का पता लगाना पसंद करते हैं और कोशिश करते हैं और इसे समझते हैं। एक निश्चित आरपीजी में वह पहले से ही अपने सभी संन्यासी बिंदु खो देगा;)
मथ्यू एम।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.