2013-06-01 10 views
9

इस उदाहरण में कुछ भी क्यों मुद्रित नहीं किया जा रहा है? मैं कोलिरु पर क्लैंग में संकलन कर रहा हूं।चालक कन्स्ट्रक्टर क्यों नहीं कहा जाता है?

#include <iostream> 

struct S 
{ 
    S() noexcept = default; 
    S(S&&) noexcept { std::cout << "move-ctor"; } 
}; 

void f(S) {} 

int main() 
{ 
    f(S{}); 
} 
+0

के संभावित डुप्लिकेट [C++ 11 कदम निर्माता नहीं बुलाया, डिफ़ॉल्ट निर्माता को प्राथमिकता दी] (http://stackoverflow.com/questions/13099603/c11-move-constructor-not-called-default-constructor-preferred) – jogojapan

उत्तर

10

संकलक प्रतिलिपि इलिजन, यहां तक ​​कि अपनी चाल निर्माता अगर जो पैरा प्रति अनुमति दी है सी ++ 11 स्टैंडर्ड की 12.8/31 प्रदर्शन कर रहा है, नकल निर्माता, या नाशक दुष्प्रभाव हो:

जब कुछ मानदंडों को पूरा किया जाता है, तो एक क्रियान्वयन को ऑब्जेक्ट की कॉपी/चाल निर्माण को छोड़ने की अनुमति है, भले ही प्रतिलिपि/चाल ऑपरेशन के लिए चयनित कन्स्ट्रक्टर और/या ऑब्जेक्ट के लिए विनाशक दुष्प्रभाव हैं।

अवधि प्रतिलिपि इलिजन तब भी जब एक कदम elided किया जा रहा है प्रयोग किया जाता है:

कॉपी/कदम आपरेशन के इस इलिजन, बुलाया प्रतिलिपि इलिजन, की अनुमति दी है निम्न परिस्थितियों में ( को कई प्रतियों को खत्म करने के लिए जोड़ा जा सकता है):

[...]

- जब एक अस्थायी वर्ग वस्तु है कि एक संदर्भ (12.2) के लिए बाध्य नहीं किया गया कॉपी किया जाएगा/एक ही सीवी-अयोग्य प्रकार के साथ एक वर्ग वस्तु को ले जाया गया, कॉपी/कदम आपरेशन अस्थायी निर्माण द्वारा छोड़ा जा सकता है छोड़े गए प्रतिलिपि का लक्ष्य में सीधे वस्तु/ले जाने के

[...]

जीसीसी के साथ, आप -fno-elide-constructors उपयोग कर सकते हैं प्रतिलिपि इलिजन बाधित करने के लिए। इस मामले में, आप देखेंगे कि चालक कन्स्ट्रक्टर का आह्वान किया जाता है, जैसा कि live example में है।

+0

अगर मैं आगे बढ़ रहा हूं तो इसे कॉपी एलिशन क्यों कहा जाता है? – user2030677

+1

@ user2030677: यह मानक शब्दावली है। ज्यादातर ऐतिहासिक कारणों से (सी ++ 03 में केवल प्रतियों को elided किया जा सकता है, क्योंकि चाल semantics मौजूद नहीं था) –

+0

@ user2030677 आप एक * प्रति * eliding कर रहे हैं, जो प्रतिलिपि निर्माता, या प्रतिलिपि चालक के साथ किया जा सकता था। – juanchopanza

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