2016-06-18 15 views
6

संपादित करें: यह जुड़ा हुआ सवाल (जो मेरा भी है) के दोहराया नहीं है। यहां सभी रिटर्न प्रकार std::vector हैं। मैं initializer-list वापस नहीं करना चाहता हूं। मैं वापस आ std::vectorinitializer-list से भरना चाहते हैं सीधेवापसी प्रारंभकर्ता सूची के बजाय वेक्टर :: समारोह

हमें उन चार मामलों लेते हैं:

1)

//Acceptable 
std::vector<int> foo(){ 
    return std::vector<int>{1}; 
} 

2)

//Acceptable 
std::vector<int> foo(){ 
    return {1};  
} 

3)

//Acceptable 
std::function<std::vector<int>()> foo=[](){ 
    return std::vector<int>{1}; 
}; 

4)

//NOT Acceptable 
std::function<std::vector<int>()> foo=[](){ 
    return {1}; 
}; 

क्यों 4 स्वीकार्य नहीं है 2 के बाद से स्वीकार्य है? उनके बीच क्या अंतर है? इसके अलावा, सबसे अजीब बात यह है कि इस स्वीकार्य है:

//Acceptable 
auto bar=[]()->std::vector<int>{ 
    return {1}; 
}; 

क्या std::function और initializer-list साथ गलत क्या है?

+3

संभावित डुप्लिकेट [मैं लैम्बडा से प्रारंभिक सूची क्यों नहीं लौटा सकता] [http://stackoverflow.com/questions/35361408/why-i-can-not-return-initializer-list-from-lambda) –

+0

इससे पहले मैं यह कहता हूं: लिंक किए गए उत्तर आपकी आंखों में इसका उत्तर कैसे नहीं देते? –

+0

यह अलग है। एक प्रारंभकर्ता-सूची लौटने के बारे में वह सवाल। यहां सभी मामलों में वापसी का प्रकार एक वेक्टर है। –

उत्तर

4

auto bar=[]()->std::vector<int>{std::vector<int> होने के लिए लैम्ब्डा bar का रिटर्न प्रकार निर्दिष्ट करता है।

std::function<std::vector<int>()> foo=[](){foo का रिटर्न प्रकार निर्दिष्ट नहीं करता है, क्योंकि आप पहली बार लैम्ब्डा के रिटर्न प्रकार को कम करते हैं, फिर इसे असाइन करें।

सी ++ खाता क्या आप जब एक प्रकार पर निर्णय लेने के लिए लैम्ब्डा असाइन कर सकते हैं पर ध्यान नहीं देता है, यह {1}, लौट जो एक std::initializer_list<int> है, जो एक std::function<std::vector<int>> के साथ असंगत है है देखता है।

1

इस भिन्नता को संकलित करता है:

std::function<std::vector<int>()> foo=[]()->std::vector<int>{ 
    return {1}; 
}; 

यह आपके मामले के 4 के समान है, लैम्ब्डा अभिव्यक्ति में स्पष्ट वापसी प्रकार के लिए छोड़कर। इससे पता चलता है कि std::function<> घोषणा का प्रकार लैम्ब्डा अभिव्यक्ति के विश्लेषण में प्रचार नहीं करता है; लैम्बडा को आस-पास की अभिव्यक्ति से स्वतंत्र रूप से पार्स किया जाता है।

मुझे यकीन नहीं है कि यह सी ++ भाषा मानक या वास्तविक दुनिया के कंपाइलरों की सीमाओं की एक विशेषता है (मैंने g++ -std=c++11 के साथ परीक्षण किया), क्योंकि मैं एक भाषा वकील का अधिक नहीं हूं।

1

में लैम्ब्डा की वापसी प्रकार (4) auto, और नहीं std::vector में के रूप में है (2) और अपने अंतिम नमूना है, जहां आप अभी भी एक लैम्ब्डा प्रयोग कर रहे हैं, लेकिन वापसी प्रकार मजबूर में के रूप में।

return {1} में auto की कटौती std::initializer_list<int>() की ओर जाता है, कि std::vector<int>()std::function उम्मीद से अलग है।

+0

* "बदले में ऑटो की कटौती {1} std :: startizer_list ()" * की ओर ले जाती है। तथ्य यह है कि 'ऑटो' = '1} में 'a';' प्रारंभकर्ता सूची बन जाती है, यह दर्शाती नहीं है कि '[] {return {1};}' वापसी प्रकार के रूप में प्रारंभकर्ता_सूची' को घटाता है। –

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