2017-01-13 16 views
5

मैं निम्नलिखित है टेम्पलेट समारोह:std :: startizer_list <int> ({1,2,3}) और {1,2,3} के बीच क्या अंतर है?

template<typename T> void foo2(T t) {} 

मुझे पता है कि मैं का उपयोग कर इसे फोन नहीं कर सकते हैं:

foo2({1,2,3}); 

क्योंकि प्रारंभकर्ता सूची एक टेम्पलेट तर्क के लिए एक गैर deduced संदर्भ है। मैं का उपयोग करना होगा:

foo2<std::initializer_list<int>>({1,2,3}); 

लेकिन मैं यह भी उपयोग कर सकते हैं: {1,2,3} और std::initializer_list<int>({1,2,3}):

foo2(std::initializer_list<int>({1,2,3})); 

जो मुझे आश्चर्य है कि क्या बीच का अंतर है बनाता है?

+9

'std :: startizer_list ({1,2,3}) 'टाइप' std :: startizer_list 'की अभिव्यक्ति है। '{1,2,3}' अभिव्यक्ति नहीं है। ब्रेस्ड सूची केवल संदर्भों में हो सकती है कि भाषा परिभाषा स्पष्ट रूप से इसे अनुमति देती है, न कि अभिव्यक्ति हो सकती है। –

+2

@ एम.एम. जब आप 0 उत्तरों के साथ किसी प्रश्न का उत्तर जानते हैं, लेकिन फिर, यह टिप्पणियों में इसका उत्तर देता है। (͡ ° ʖ̯ ͡ °) – luk32

+2

@ luk32 एक उत्तर लिखने के लिए स्वतंत्र महसूस करें ... मुझे लगता है कि एक पूर्ण उत्तर टेम्पलेट के विवरण को कवर करना चाहिए जो मुझे –

उत्तर

7

braced-init list एक अभिव्यक्ति नहीं है, और इस प्रकार एक प्रकार नहीं है। जब आप

foo2({1,2,3}); 

फोन संकलक किस प्रकार {1,2,3} आपके मन में प्रतिनिधित्व नहीं जानता है, और इसलिए यह संकलन नहीं है।

foo2<std::initializer_list<int>>({1,2,3}); 

संकलित क्योंकि यहाँ संकलक प्रकार अनुमान की जरूरत नहीं है, आप इसे निर्दिष्ट किया है, यह std::initializer_list<int> है। तो यह t{1,2,3} के साथ प्रारंभ कर सकता है।

तीसरा कॉल भी संकलित करता है क्योंकि संकलक प्रकार को कम कर सकता है। std::initializer_list<int>({1,2,3}) स्पष्ट रूप से std::initializer_list<int> है, और इसलिए यह उत्तीर्ण होने के साथ t प्रारंभ कर सकता है।

+2

ध्यान दें कि सी ++ 17 में "गारंटीकृत elision" नियम आपके अंतिम पैराग्राफ को अलग करते हैं। एक अर्थ में, वहां कोई मूल्य नहीं बनाया गया है, फिर फ़ंक्शन तर्क से elided; यह फ़ंक्शन तर्क आरंभ करने का एक तरीका बन गया है। या तो मैं इकट्ठा करता हूं, मैंने अभी तक नए नियमों को निपुण नहीं किया है। (अभ्यास में, इस मामले में कोई फर्क नहीं पड़ता है) – Yakk

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