2014-11-23 6 views
9

मुझे कोई तार्किक कारण नहीं दिख रहा है। मेरा मतलब है आप आसानी से एक संरचना इस तरह एक सरणी सदस्य युक्त का उपयोग करके आवश्यकता को दूर कर सकते:आईएसओ सी ++ क्यों लौटने वाले सरणी मना करता है?

template <size_t n> 
struct arr { int d[n]; }; 

auto fnReturningArray() 
{ 
    return arr<3>{0, 1, 2}; 
}; 

के रूप में यदि सरणी सीधे छोटा सा फर्क के साथ वापस आ गया है कि आप पहले का उपयोग करना चाहिए कौन सा ठीक उसी तरह से व्यवहार करेंगे इसका उपयोग करने के लिए संरचना सदस्य 'डी'। इसके अलावा मानक ने 'std :: array' प्रकार से समान कार्यक्षमता को जोड़ा है। तो ऐसा लगता है कि यह कार्यान्वयन संभव है। फिर आईएसओ सी ++ ने इस कार्रवाई को क्यों मना कर दिया है? हो सकता है कि विरासत कोड संगतता (लेकिन मुझे शायद ही यह विश्वास हो कि यह अन्य नई चीजों के साथ ही मामला लंबा हो गया है, उदाहरण के लिए 'ऑटो' कीवर्ड का नया अर्थ)।

+6

क्योंकि सरणी की प्रतिलिपि नहीं बनाई जा सकती है। – Columbo

+3

Arrays कॉपी करने योग्य या असाइन करने योग्य नहीं हैं, इसलिए आप उन्हें वापस नहीं कर सकते हैं या उन्हें मूल्य से पास नहीं कर सकते हैं। यह क्यों है, ठीक है, यह एक अच्छा सवाल होगा। – juanchopanza

+0

@ कोल्लमबो लेकिन जब वे संरचना में जादुई रूप से प्रतिलिपि बन गए। – AnArrayOfFunctions

उत्तर

3

तथ्य यह है कि मानक यह अनुमति नहीं है, और ऐतिहासिक कारणों से है कि यह समझा सकता है के अलावा, इस मुद्दे को वाक्यात्मक है:

कल्पना कीजिए तो इसकी अनुमति है: कैसे आप के नामकरण भेद हैं पूरे सरणी, बनाम सरणी पता, बनाम एक भी तत्व:

auto fnReturningArray() 
{ 
    int a[3] = {0, 1, 2}; 
    return a;  // what is meant here ? the address of the array ? or the whole array ? 
}; 

आप (जैसे tating कि एक पूरी सरणी होगा के रूप में) मौजूदा नियमों का अर्थ बदल चाहते हैं तो आप विरासत के साथ विशाल समस्याओं के लिए होता है कोड।

+2

संभवतः आपके पास एक नियम होगा जो कहता है कि आप 'int [3]' लौट रहे हैं, क्योंकि यह 'ए' का प्रकार है। अगर भाषा को सरणी वापस करने की अनुमति है, तो यह सही समझ में आएगा। आप यहां एक परिपत्र तर्क का उपयोग कर रहे हैं। – juanchopanza

+8

यह आसान है: 'ए' एक सरणी है, तो इसका मतलब यह होगा कि आप एक सरणी लौट रहे हैं। यदि आप पहले तत्व को पॉइंटर चाहते हैं, तो आप '& a [0] 'लिखेंगे। ऐसा नहीं है कि सी ++ कैसे काम करता है, लेकिन यह एक पूरी तरह से समझदार भाषा होगी। – hvd

+1

@ एचवीडी: लेकिन तथ्य यह है कि सी ++ कामों का मतलब यह नहीं है कि अगर यह जोड़ा गया तो यह भ्रमित/भ्रामक/संदिग्ध वाक्यविन्यास _in C++ _ होगा। –

0

जवाब मैं इसे देखते हैं, दोहरा है: सी सी के साथ

  1. संगतता इस तरह से काम नहीं करता। क्यूं कर? कोई जानकारी नहीं। सी विभिन्न पहलुओं में शुरू करने के लिए कभी भी बहुत तार्किक नहीं था।

  2. सी ++ भाषा सुविधाओं पर पुस्तकालय सुविधाओं को पसंद करता है। यह देखते हुए कि सी ++ 98 पहला मानक था, और यह ज्यादातर सी से मूल बातें कॉपी करता है (बिंदु 1 देखें), इसे पहले प्रमुख संशोधन, सी ++ 11 में सही किया गया था, जो पुस्तकालय प्रकार std :: array प्रस्तुत करता है, जो , एक शुद्ध और सरल पुस्तकालय सुविधा के रूप में, सभी घृणित quirks हल करता है कि सी शैली सरणी लागू होती है।

संक्षेप में: भले ही यह समझ बनाने सकता है सरणियों के लिए उचित मूल्य अर्थ विज्ञान है, यह ऐसा कभी नहीं होगा, क्योंकि स्पष्ट कमी और अधिक जटिल यह पहले से ही है की तुलना में भाषा बनाने के बिना हल किया जा सकता। विरासत और पिछड़ा संगतता से छुटकारा पाने में बेहद मुश्किल है, इसलिए std :: array का वर्तमान विकल्प वास्तव में आप चाहते हैं। इसका इस्तेमाल करें। यह आसान है। आप पसंद करोगे। बहुत।

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