मैं समझता हूँ कि, एक braced प्रारंभकर्ता दिया, auto
std::initializer_list
का एक प्रकार अनुमान है, जबकि टेम्पलेट प्रकार कटौती असफल हो जायेगी:ब्रेक किए गए प्रारंभकर्ताओं के लिए ऑटो और टेम्पलेट प्रकार की कटौती क्यों भिन्न होती है?
auto var = { 1, 2, 3 }; // type deduced as std::initializer_list<int>
template<class T> void f(T parameter);
f({ 1, 2, 3 }); // doesn't compile; type deduction fails
मैं भी, जहां इस सी ++ 11 मानक में निर्दिष्ट किया जाता पता: 14.8। 2.5/5 गोली 5:
[It's a non-deduced context if the program has] A function parameter for which the associated argument is an initializer list (8.5.4) but the parameter does not have std::initializer_list or reference to possibly cv-qualified std::initializer_list type. [ Example:
template void g(T);
g({1,2,3}); // error: no argument deduced for T
—end example ]
मुझे क्या पता या समझ में नहीं आता कारण है कि प्रकार कटौती व्यवहार में इस अंतर मौजूद है। सी ++ 14 सीडी में विनिर्देश सी ++ 11 जैसा ही है, इसलिए संभवतः मानकीकरण समिति सी ++ 11 व्यवहार को दोष के रूप में नहीं देखती है।
क्या कोई जानता है कि क्यों auto
ब्रेसिड प्रारंभकर्ता के लिए एक प्रकार काट देता है, लेकिन टेम्पलेट्स की अनुमति नहीं है? फॉर्म के सट्टा स्पष्टीकरण "यह कारण हो सकता है" दिलचस्प है, मैं विशेष रूप से उन लोगों से स्पष्टीकरण में रूचि रखता हूं जो जानते हैं मानक क्यों लिखा गया था।
हाल ही में एक और एसओ सवाल पूछा गया था जिसे आपने समझ लिया था। इसमें कुछ क्यों हो सकता है। – chris
ठीक है, इसे मिला। एकमात्र असली चर्चा क्यों एक टिप्पणी है, लेकिन आप एक नज़र डाल सकते हैं: http://stackoverflow.com/questions/17496268/type-inference-with-rvalue-initializer-list – chris
[स्कॉट मेयर्स] से उद्धरण (http://scottmeyers.blogspot.cz/2013/07/when-decltype-meets-auto.html): "* मुझे नहीं पता कि' ऑटो 'के लिए कटौती क्यों टाइप करें और टेम्पलेट्स के लिए समान नहीं है। अगर आपको पता है, तो कृपया मुझे बताएं! * "। –