2013-05-20 6 views
14

ऐसा प्रतीत होता है कि auto कीवर्ड का उपयोग करके अलग-अलग प्रकार के एकाधिक चर घोषित करने की अनुमति नहीं है। मैं मानक में शब्द को समझ नहीं सकता जो इसे रोक देगा।सभी 'ऑटो' घोषणाओं को एक ही प्रकार का क्यों होना चाहिए?

auto i = 1, j = 1.0; //deduction failure (several compilers) 

ऐतिहासिक मैं समझता हूँ के बाद से आप केवल एक डीईसीएल-विनिर्देशक-कल्पना है। हालांकि, मानक में नियमों को रोकना प्रतीत नहीं होता है, वास्तव में वे प्रोत्साहित करते हैं कि auto प्रत्येक के लिए एक अलग प्रकार हो सकता है। पर विचार करें इन अनुच्छेदों:

8-3 एक घोषणा में प्रत्येक init-declarator अलग से विश्लेषण किया जाता है जैसे कि यह अपने आप में एक घोषणा में था।

7.1.6.4-7 यदि घोषणाकर्ताओं की सूची में एक से अधिक घोषणाकर्ता शामिल हैं, तो प्रत्येक घोषित चर के प्रकार को ऊपर वर्णित अनुसार निर्धारित किया गया है। [...]

भी auto बिना नहीं सभी चर एक ही प्रकार, के रूप में * जैसे कुछ संशोधक व्यक्तिगत रूप से प्रत्येक declarator लागू किया जा सकता है की जरूरत है। मेरे लिए यह अब प्रकट होता है कि शब्द प्रत्येक auto घोषणाकर्ता को पूरी तरह से अलग प्रकार की अनुमति देता है।

कौन सा पैराग्राफ इस पर प्रतिबंध लगाएगा?

+1

बीटीडब्ल्यू - 7.1.6.4/3 में उदाहरण का उपयोग 'कॉन्स ऑटो * वी = और एक्स, यू = 6 है; // ठीक है: v में टाइप कॉन्स int * है, आपके पास टाइप कॉन्स int है - स्पष्ट रूप से विचार यह है कि पहले चर से टाइप कटौती का उपयोग बाद वाले लोगों को बनाते समय किया जा सकता है .... –

उत्तर

9

टाइप में प्रत्येक ऑब्जेक्ट के लिए कटौती का प्रदर्शन किया जाता है, लेकिन अंतिम परिणाम एक ही प्रकार [dcl.spec.auto]/7 (जोर मेरा):

यदि घोषणाकर्ताओं की सूची में एक से अधिक घोषणाकर्ता शामिल हैं, तो प्रत्येक घोषित चर का प्रकार ऊपर वर्णित अनुसार निर्धारित किया गया है। यदि टेम्पलेट पैरामीटर यू के लिए निकाला गया प्रकार प्रत्येक कटौती में समान नहीं है, तो प्रोग्राम खराब हो गया है।

+0

हां, पैराग्राफ का वह हिस्सा उस मसौदे में नहीं था जिसे मैं पढ़ रहा था। '...'मेरे प्रश्न में उसके बाद आता है। मैंने अपने प्रश्न को सत्यापित करने के लिए अंतिम मानक खरीदा, क्योंकि मैं संदिग्ध था। –

+0

वास्तव में '[dcl.spec.auto]/6' में जवाब नहीं है, न कि '[dcl.spec.auto]/7'? –

2

मैं (यह उन जो वास्तव में अंतिम एक देर मसौदा और सरकारी मानक के बीच अलग से एक है) को सही शब्दों पाया।

7.1.6.4-7 यदि घोषणाकर्ताओं की सूची में एक से अधिक घोषणाकर्ता शामिल हैं, तो प्रत्येक घोषित चर के प्रकार को ऊपर वर्णित अनुसार निर्धारित किया गया है। यदि टेम्पलेट पैरामीटर यू के लिए प्रयुक्त प्रकार प्रत्येक कटौती में समान नहीं है, तो प्रोग्राम खराब बना हुआ है।

जहां पिछले पैराग्राफ में 'यू' का वर्णन एक आविष्कार प्रकार है जो प्रत्येक पैरामीटर की कटौती के लिए उपयोग किया जाता है। यह मसौदे में एक दुर्भाग्यपूर्ण बदलाव है क्योंकि यह एक बहुत अच्छी सुविधा होगी। (हालांकि मैं मानक में पिछले पैराग्राफ को भी गलत समझा सकता हूं, क्योंकि यह std :: startizer_list से भी संबंधित है)

+0

N3337 में यह पैराग्राफ भी है। –

+0

मैं इसे संकलक कार्यान्वयन करने वालों पर मामूली रूप से आसान बनाने के लिए देख सकता था। – Yakk

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

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