2014-09-14 32 views
5

initlializer_list मैं निम्नलिखित समारोह टेम्पलेट है:समारोह टेम्पलेट कटौती और

template <typename K, typename V> 
void f(std::initializer_list<std::pair<const K, V>> il) 
{ 
    //... 
} 

मैं समारोह के रूप में इस फोन:

f({std::pair<const int,int>(1,2), std::pair<const int,int>(3,4)}); //(a) 

और यह ठीक काम करता है।

हालांकि, अगर मैं कोशिश करते हैं और इसे कहते इस प्रकार है:

f({{1,2}, {3,4}}); //(b) 

यह सही प्रकार अनुमान करने में सक्षम नहीं है, और मैं की तर्ज पर एक संकलन त्रुटि मिलती है:

'no matching function for call to 'f(<brace-enclose initializer list>) 
note candidate is: 
note: template <class K, class V> void f(std::initializer_list<std::pair<const K, V>>)' 

यदि मैं इसे निम्नानुसार कॉल करता हूं:

f({std::pair<const int,int>(1,2), {3,4}}); //(c) 

प्रकार कटौती कार्य करता है, लेकिन यदि मैं इसे निम्न प्रकार से कोशिश करता हूं और कॉल करता हूं:

f({std::make_pair(1,2), {3,4}}); //(d) 

मुझे पहले जैसा ही संकलन त्रुटि मिलती है।

मेरा प्रश्न है:

क्यों में (ग) टेम्पलेट प्रकार कटौती काम लेकिन में (घ) नहीं?

(संकलक, जीसीसी v4.6.3 है झंडा -std = C++ 11) के साथ

मैं समान पर ध्यान दिया है, पुराने अतः पदों पर वे काफी इस सवाल का जवाब करने के लिए प्रकट नहीं किया था।

उत्तर

4

ख के साथ समस्या) कि संकलक की तरह

{1,2} 

साथ ही एक initializer_list<int> के लिए ले जाया जा सकता है, साथ घ समस्या) है कुछ के बाद से प्रकार पता नहीं लगा सकते है कि make_pair जोड़ी

+0

हाँ के पहले भाग के लिए const int उत्पन्न नहीं करेगा हां, मुझे बी के साथ लगाया जाएगा) जो अनुमान नहीं लगा सकता है, हालांकि, make_pair से गैर const int int के बारे में भूल गया। धन्यवाद। – TPJ

+0

'{1,2}' 'प्रारंभकर्ता_सूची ' "के लिए नहीं लिया गया है, यह एक गैर-कटौती संदर्भ है जब तक कि इसे 'प्रारंभकर्ता_सूची ' के साथ जोड़ा जाता है। एक अंतर है (यदि संकलक वास्तव में सभी मामलों में '{1, 2}' से 'प्रारंभकर्ता_सूची ' घटाता है, तो (सी) संकलित नहीं होगा)। –

+0

मैंने वाक्य को दोहराया, धन्यवाद! –

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