2013-08-18 17 views
6

std::tuple होता है, दूसरों के बीच, निम्नलिखित कंस्ट्रक्टर्स:क्या सभी std :: tuple constructors आवश्यक हैं?

explicit tuple(const Types&... args); 

template< class... UTypes > 
explicit tuple(UTypes&&... args); 

दोनों बराबर विवरण हैं, जिसमें वे args में संबंधित मान के साथ तत्वों में से प्रत्येक के आरंभ की है। केवल अंतर यह है कि दूसरे में पैरामीटर अग्रेषित किए जाते हैं।

जो मैंने रावल संदर्भों के बारे में समझा है, मुझे नहीं लगता कि पहले संस्करण की आवश्यकता क्यों है क्योंकि उसी पैरामीटर को दूसरे संस्करण में पारित किया जा सकता है। संदर्भों को अग्रेषित किया जाएगा और कोई भी बुद्धिमान नहीं होगा, विशेष रूप से चाल अर्थशास्त्र का कोई उल्लेख नहीं है।

क्या कोई यह समझा सकता है कि यह दोनों रचनाकारों को आवश्यक बनाता है?

template <typename T> 
struct foo 
{ 
    foo(const T&); 
    template <typename U> 
    foo(U&&); 
}; 

दूसरे निर्माता टेम्पलेट प्रकार कटौती के कुछ प्रकार की आवश्यकता है:

+3

दूसरे संस्करण अधिभार सेट नहीं तो सब से बाहर SFINAE-डी है 'UTypes' परोक्ष इसी के लिए परिवर्तनीय हैं' Types' – jrok

उत्तर

10

यहाँ एक सरल उदाहरण है। यह सभी मामलों में काम नहीं करता है, उदा। प्रारंभकर्ता सूचियों के साथ। निम्नलिखित आरंभ ही काम करता है, अगर पहले निर्माता उपलब्ध है:

auto f = foo<std::vector<int>>{ { 1, 2, 3 } }; 
0

यह rvalue संदर्भ अग्रेषण के लिए है, और इस कदम के निर्माण के लिए अनुकूलित है। पहला संस्करण lvalues ​​के लिए प्रयोग किया जाता है। बेहतर व्याख्या करने के लिए निम्न लिंक देखें।

http://thbecker.net/articles/rvalue_references/section_07.html

+4

दूसरे संस्करण rvalue संदर्भ के लिए और साथ ही lvalue संदर्भ के लिए इस्तेमाल किया जा सकता। – nosid

+0

सहमत है लेकिन संकलक फ़ंक्शन हस्ताक्षर के लिए संकलन समय पर सबसे अच्छा विकल्प देगा और इस मामले में उनके पास 2 हस्ताक्षर उपलब्ध हैं। मैं आपके उत्तर से सहमत हूं और साथ ही यह टेम्पलेट कटौती में मदद करता है और उस कारण से आवश्यक है। – bjackfly

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