2014-09-01 10 views
46

मुझे सी ++ 11 में auto पसंद है। यह अद्भुत है। - सी ++ काफी छोटे विसंगतियों और कोना हैऑटो एक्स {3} प्रारंभिकज़र_सूची क्यों कम करता है?

int i = 3;  // i is an int with value 3 
int i = int{3}; // i is an int with value 3 
int i(3);  // i is an int with value 3 (possibly narrowing, not in this case) 
int i{3};  // i is an int with value 3 

auto i = 3;  // i is an int with value 3 
auto i = int{3}; // i is an int with value 3 
auto i(3);  // i is an int with value 3 
auto i{3};  // wtf, i is a std::initializer_list<int>?! 

यह अजीब व्यवहार नए लोगों के लिए भ्रामक है, और कष्टप्रद अनुभवी उपयोगकर्ताओं के लिए: लेकिन यह एक विसंगति है कि वास्तव में क्योंकि मैं इस पर सब समय यात्रा, मेरी नसों पर हो जाता है है ऐसे मामलों को जिन्हें किसी को ध्यान में रखना है। क्या कोई यह समझा सकता है कि मानक समिति ने इस मामले में एक नया परिचय देने का फैसला क्यों किया?

मैं यह समझ सकता है अगर प्रकार std::initializer_list के एक चर घोषित कुछ है कि उपयोगी था या अक्सर किया, लेकिन मेरे अनुभव में यह लगभग कभी जानबूझकर है था -

के किसी भी और दुर्लभ मामलों में जहां आप यह करने के लिए करना चाहता था में,
std::initializer_list<int> l{3}; 
auto l = std::initializer_list<int>{3}; 
auto l = {3}; // No need to specify the type 

ठीक काम करेगा। तो auto x{i} के लिए विशेष मामले के पीछे क्या कारण है?

+14

यह बहुत अधिक है कि [नियम बदलने जा रहा है] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3922.html)। –

+1

संबंधित: http://stackoverflow.com/q/17582667 – dyp

+1

समाधान: उन मामलों में से किसी के लिए ऑटो का उपयोग न करें (# 2 को छोड़कर)। :-) – dlf

उत्तर

33

लम्बी कहानी कम करने के लिए:

  • एक braced प्रारंभकर्ता अभिव्यक्ति {} अपने आप में कोई प्रकार नहीं है
  • auto प्रकार जानकारी का अनुमान लगाने के लिए है
  • int{3} स्पष्ट रूप से से लिया मूल्य के साथ एक int वर बनाने का अर्थ है " प्रारंभकर्ता सूची ", इस प्रकार इसका प्रकार सिर्फ int है और किसी भी व्यापक संदर्भ में उपयोग किया जा सकता है (int i = int{3} काम करेगा और auto i = int{3} प्रकार कम कर सकता है, क्योंकि दायां तरफ स्पष्ट रूप से है क्योंकि समिति कि करार दिया, लेकिन - प्रकार int)
  • {3} अपने आप में कोई प्रकार (यह नहीं, int हो सकता है, क्योंकि यह एक मूल्य लेकिन एक प्रारंभकर्ता सूची), इसलिए auto कार्य नहीं करेगा नहीं है है auto अभी भी इस मामले में काम करना चाहिए, उन्होंने फैसला किया कि "सर्वश्रेष्ठ, परिभाषा द्वारा टाइपलेस) प्रारंभकर्ता सूची ... std::initializer_list होगी, जैसा कि आप पहले ही अनुमान लगा चुके हैं।

लेकिन, जैसा कि आपने बताया, इसने auto का संपूर्ण व्यवहार काफी अर्थपूर्ण रूप से असंगत बना दिया। यही कारण है कि इसे बदलने के प्रस्ताव थे - अर्थात् N3681, N3912 और N3922 - समिति को प्रस्तुत किया गया। इस प्रस्ताव पर कोई समिति सर्वसम्मति के कारण पूर्व प्रस्ताव को एफआई 3 के रूप में अस्वीकार कर दिया गया था, http://isocpp.org/files/papers/n3852.html#FI3, वर्तमान (एन 3 9 22) adopted ca. Q1 of 2015 मिला;

tl; डॉ आप मान सकते हैं standards-compliant compilers1bleeding-edge C++ support2 किसी के साथ जगह में पहले से ही नया, अधिक समझदार-ish अर्थ विज्ञान है, या इसे शीघ्र ही होगा।

मानकीकरण समिति ने ड्राफ्ट सी ++ 17 में एन 3 9 22 को अपनाने से समस्या को स्वीकार किया।

- तो यह

auto x1 = { 1, 2 }; // decltype(x1) is std::initializer_list<int> 
auto x2 = { 1, 2.0 }; // error: cannot deduce element type 
auto x3{ 1, 2 }; // error: not a single element 
auto x4 = { 3 }; // decltype(x4) is std::initializer_list<int> 
auto x5{ 3 }; // decltype(x5) is int 

अब है, बेहतर या बदतर के लिए।

आगे पढ़ने:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3681.html

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3912.html

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3922.html

http://scottmeyers.blogspot.com/2014/03/if-braced-initializers-have-no-type-why.html

http://herbsutter.com/2014/11/24/updates-to-my-trip-report/


जीसीसी 5.1 (& अप) apparently uses N3922 even in C++11/C++14 mode

बजना 3.8, चेतावनी

साथ यह एक पीछे की ओर-असंगत परिवर्तन है कि सभी भाषा संस्करण के लिए लागू किया जाता है कि ऑटो से प्रकार की कटौती की अनुमति दें (सी ++ समिति के अनुरोध के अनुसार)।

+2

एन 3 9 22 को एक साल पहले (नवंबर 2014, उरबाना में) अपनाया गया था। –

+0

@TC बहुत से धन्यवाद के लिए धन्यवाद - और अजीब है कि किसी ने इसका उल्लेख नहीं किया पहले! – vaxquis

+0

@vaxquis क्या आप जानते हैं कि यह कब स्वीकार किया जाएगा और जी ++ और क्लैंग जैसे अधिकांश कंपाइलर्स पर लागू किया जाएगा? – Curious

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