2017-05-17 11 views
5

नीचे कोड कैसे काम करता है/केवल डिफ़ॉल्ट कंपाइलर जेनरेटर कन्स्ट्रक्टर? मैं इसे पीओडी के लिए उम्मीद करता हूं लेकिन नीचे की संरचना शायद पीओडी नहीं है, इसलिए यह कुछ और होना चाहिए। एक जेसन के टर्नर सी ++ साप्ताहिक 49/50 ईपी जहां वह std::forward<T>(t)...वैराडिक क्लास टेम्पलेट और विरासत - डिफॉल्ट कंपाइलर जेनरेटर कन्स्ट्रक्टर

+0

"पीओडी" वास्तव में सी ++ में कोई चीज़ नहीं है। –

+3

'सी' एक सी ++ 17 कुल है। –

+0

धन्यवाद! मैं इस नए सी ++ 17 से अनजान था। – Kobi

उत्तर

7

खेलने में कोई कंस्ट्रक्टर्स यहाँ हैं के साथ एक variadic निर्माता परिभाषित करने के लिए अनुवर्ती

template <typename ... T> 
struct C : T ... { 
    using T::operator()...; 
}; 

// template class guidance feature of C++17 
template <typename ... T> 
C(T...) -> C<T...>; 

int main(){ 
    C c { []{}, [](int){} }; 
    c(3); 
} 

इस सवाल के रूप में आता है। यह कोड C++ 17:

  1. कन्स्ट्रक्टर के लिए टेम्पलेट पैरामीटर कटौती (P0091) में तीन विशेषताओं के संगम के कारण काम करता है।
  2. कुल प्रारंभिक विस्तार (P0017)
  3. उपयोग-घोषणाओं का आधुनिकीकरण (P0195)।

क्या इस पंक्ति में होता है:

C c { []{}, [](int){} }; 

कि पहले, हम टेम्पलेट पैरामीटर कटौती (1) निकालना कि c प्रकार C<__lambda1, __lambda2> की वास्तव में है का उपयोग करें। यह आपके कटौती मार्गदर्शिका के उपयोग के माध्यम से किया जाता है।

इसके बाद, C<__lambda1, __lambda2> के बाद से एक समग्र ((2) के आधार वर्ग प्रतिबंध में छूट की वजह से - आप सही है कि सी ++ 11/14 में एक समग्र विचार नहीं किया है कर रहे हैं) है, हम उपयोग कर सकते हैं कुल-आरंभीकरण इसे शुरू करने के लिए। हम एक कन्स्ट्रक्टर का उपयोग करते हैं। आधारभूत कक्षाओं के साथ अब समग्र प्रारंभिक तरीके से काम करने का तरीका यह है कि हमें बस बाएं से दाएं बेस को प्रारंभ करना होगा। तो पहली अभिव्यक्ति ([]{}) का उपयोग पहली बेस क्लास (__lambda1) को शुरू करने के लिए किया जाता है और दूसरी अभिव्यक्ति ([](int){}) का उपयोग दूसरी बेस क्लास (__lambda2) को आरंभ करने के लिए किया जाता है।

अन्त में, कॉल c(3) काम करता है क्योंकि (3) की अनुमति दी तो आप बस

using T::operator()...; 

जो C के दायरे में, जहां अधिभार संकल्प अपेक्षा के अनुरूप काम कर सकते हैं में दोनों lambdas 'कॉल ऑपरेटरों में लाता है लिखने के लिए। नतीजा यह है कि हम __lambda2 के कॉल ऑपरेटर को कॉल करते हैं, जो कुछ भी नहीं करता है।

+0

धन्यवाद। अगर मेरे पास सी में कोई सदस्य होगा, तो मैं int कहूंगा; यह पूरी बात टूट जाएगी, है ना? बी को शुरू करने का कोई तरीका नहीं है ... और सी के int i; सदस्य। क्या मेरी समझ सही है? – Kobi

+0

मुझे लगता है कि यह होगा, उदाहरण के लिए, 'सी सी {[] {}, [] (int) {}, 1}; '। प्रारंभिक में आधार के बाद आप कुल सदस्यों को प्रारंभ करते हैं। [P0017r1] में "स्कोप" देखें (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0017r1.html) – TBBle

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