2017-01-24 25 views
14

Template argument deduction for class templates प्रस्ताव के बारे में मेरी समझ कटौती संदर्भों में टेम्पलेट कार्यों और टेम्पलेट कक्षाओं के व्यवहार को समेकित करना था। लेकिन मुझे लगता है कि मुझे कुछ गलत समझा जाना चाहिए था।सी ++ 17 वर्ग टेम्पलेट आंशिक कटौती

हम इस टेम्पलेट वस्तु है, तो:

template <std::size_t S, typename T> 
test<S, T> helper(T (&input)[S]) { return input; } 

कौन सा नीचे दिखाया गया के रूप में इस्तेमाल किया जा सकता है:

template <std::size_t S, typename T> 
struct test 
{ 
    static constexpr auto size = S; 
    using type_t = T; 

    test(type_t (&input)[size]) : data(input) {} 
    type_t (&data)[size]{}; 
}; 

मैं test वस्तुओं बनाने के लिए वाक्यात्मक चीनी के रूप में एक सहायक समारोह का उपयोग करते हैं:

int main() 
{ 
    int buffer[5]; 

    auto a = helper<5, int>(buffer); // No deduction 
    auto b = helper<5>(buffer);  // Type deduced 
    auto c = helper(buffer);   // Type and size deduced 

    std::cout << a.size << b.size << c.size; 

    return 0; 
} 

उम्मीद के अनुसार 555 आउटपुट के ऊपर कोड। मैं नए संकलक सेटअप का उपयोग कर Wandbox में एक ही कोशिश की है:

int main() 
{ 
    int buffer[5]; 

    test<5, int> a(buffer); // No deduction: Ok. 
    test<5> b(buffer);  // Type deduced: FAILS. 
    test c(buffer);   // Type and size deduced: Ok. 

    std::cout << a.size << b.size << c.size; 

    return 0; 
} 

यह वर्ग टेम्पलेट्स के लिए टेम्पलेट तर्क कटौती की तरह दिखता है केवल सभी मापदंडों, मैं दोनों व्यवहार (सहायक समारोह और वर्ग उम्मीद कर रहा था बात का अनुमान लगाना काम करता है टेम्पलेट) वही होना चाहिए, क्या मैंने कुछ गलत समझा?


Wandbox में पिछले compilers availables जीसीसी प्रमुख 7.0.1 201,701 और बजना प्रमुख 5.0.0 (ट्रंक) हैं।

+2

'type_t (और डेटा) [आकार] {} है;' एक सरणी संदर्भ? क्या '{}' प्रारंभकर्ता है? क्या वह संकलित करता है? इसके अलावा, * सिंटैक्टिक चीनी * बहुत शरारती लगता है। :) – wally

+2

ध्यान दें कि [एक स्पष्ट * कटौती गाइड *] जोड़ना (http://melpon.org/wandbox/permlink/VEE5DyIE3w3LEGEX) मदद नहीं करता है।मेरा मानना ​​है कि आंशिक कटौती समर्थित नहीं है क्योंकि मानक * टेम्पलेट नाम * * (यानी '<...> 'वाक्यविन्यास के साथ * कटौती प्लेसहोल्डर्स को परिभाषित करता है *। इसलिए 'परीक्षण <5> 'वैध कटौती प्लेसहोल्डर नहीं है। –

+0

@ मस्कैम्पस्टर 'टाइप_टी (और डेटा) [आकार] {}; 'एक सरणी संदर्भ है, हां। '{}' वास्तव में प्रारंभकर्ता है, और यह संकलित करता है [इसे आज़माएं!] (Http://melpon.org/wandbox/permlink/KCkDg5EEIKbZbPU3)। * सिंटैक्टिक शुगर * के बारे में मैं क्या कह सकता हूं ...: '(अंग्रेजी मेरी मां नहीं है और मुझे बहुत सारी गलतियां हैं! –

उत्तर

11

इस उत्कृष्ट trip report Botond Ballo द्वारा से:

सुविधा मूल रूप से प्रस्तावित के रूप में आंशिक कटौती, जहां आप स्पष्ट रूप से टेम्पलेट तर्क के कुछ निर्दिष्ट करें, और बाकी को छोड़ देने का प्रावधान शामिल निष्कर्ष निकाला जा सकता है, यह लेकिन चिंताओं से अधिक खींचा गया था कि यह कुछ मामलों में बहुत भ्रामक हो सकते हैं:

// Would have deduced tuple<int, string, float>, 
// but tuple<int> is a well-formed type in and of itself! 
tuple<int> t(42, "waldo", 2.0f); 
+2

मुझे यह तर्क बहुत अजीब लगता है। तो सबसे पहले हमने 'std :: make_tuple (42, "वाल्डो", 2.0 एफ) किया है;' माना जाता है कि गलत बात यह है कि लोगों ने सिखाया है कि जब वे कटौती की जाती हैं तो टेम्पलेट तर्क निर्दिष्ट करना गलत होता है। अब इसे मना कर, हम वर्ग टेम्पलेट के लिए अलग-अलग तरीके से काम करने के लिए कटौती करते हैं क्योंकि कार्य एक (असंगतता) और वैध उपयोग मामलों के एक टन को अवरुद्ध करता है (प्रदूषित ट्यूपल उदाहरण से अलग)। – Predelnik

12

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

हम एक टेम्पलेट नाम एक सरल प्रकार-विनिर्देशक या आंशिक रूप से आपूर्ति की स्पष्ट टेम्पलेट तर्क के साथ के रूप में एक वर्ग टेम्पलेट की चर्चा करते हुए अनुमति देने के लिए प्रस्ताव दो में संदर्भों:

लेकिन वास्तविक मानकों एक ही प्रस्ताव "आंशिक रूप से आपूर्ति की स्पष्ट टेम्पलेट तर्क" को संभालने के लिए एक तरह से प्रदान नहीं करता है में शब्दोंtemplate-name को सरल-प्रकार-विनिर्देशक के रूप में टेम्पलेट तर्क रखने की अनुमति नहीं है।

तो विनिर्देशन के बाद, संकलक का व्यवहार सही प्रतीत होता है।

+3

हां, विशेष रूप से वह पेपर प्रारंभिक भागों को सिंक में रखने में नाकाम रहने वाले लेखक का एक आकस्मिक मामला है क्योंकि शब्द और डिज़ाइन संशोधित किया गया है। परिणाम दुर्भाग्य से सक्रिय रूप से भ्रामक प्रारंभिक खंड है। –

+0

अच्छी बात यह है कि वे अंतिम वोट प्राप्त करने से पहले एक और बैठक करते हैं। –

+1

@ मिकेलएफ: आप मानते हैं कि वे वास्तव में आंशिक विनिर्देश की अनुमति देंगे। लेखन में असंगतता से पता चलता है कि यह कुछ समिति के बजाय * निकालने के लिए चुना गया था, मूल लेखक बस अपने शब्दों में गलती कर रहे हैं। –

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