फ़ंक्शन पैरामीटर के लिए टेम्पलेट तर्क प्लेसहोल्डर के रूप में 'ऑटो'


22

C ++ 20 autoफ़ंक्शन पैरामीटर प्रकार के लिए उपयोग करने की अनुमति देता है ।

क्या यह फ़ंक्शन पैरामीटर प्रकार के लिए autoटेम्पलेट तर्क प्लेसहोल्डर के रूप में उपयोग करने की अनुमति देता है (समान नहीं है, लेकिन एक तरह से C ++ 17 टेम्पलेट <ऑटो> की भावना में )?

तो निम्नलिखित कोड, पूर्व C ++ 20:

template<typename First, typename Second>
void printPair(const std::pair<First, Second>& p) {
    std::cout << p.first << ", " << p.second;
}

के रूप में लिखा जा सकता है:

void printPair(const std::pair<auto, auto>& p) {
    std::cout << p.first << ", " << p.second;
}

यह संकलित करता है और अवधारणाओं के लिए प्रायोगिक जीसीसी कार्यान्वयन के साथ अच्छी तरह से काम करता है

क्या यह सी ++ 20 के साथ एक वैध वाक्यविन्यास है?


मैंने जो सुना है, उसमें से अनर्गल auto सीधे टेम्पलेटेट में तब्दील हो जाता है typename XYZ, जो दृढ़ता से यह संकेत देगा कि यह वैध वाक्यविन्यास है। नीट
फ्यूरिश

2
ध्यान दें कि क्लैग असहमत है और क्लैंग और जीसीसी के बारे में एक ही असहमति है कि क्या autoअनुमति है [](const std::pair<auto, auto>& p){}(चाहे -std=c++2aया साथ में -std=c++17)।
अखरोट


धन्यवाद @DavisHerring - मैंने शब्दांकन तय कर दिया है
अमीर किर्श

जवाबों:


17

यह सिंटैक्स C ++ कॉन्सेप्ट टेक्निकल स्पेसिफिकेशन में मान्य है, लेकिन C ++ 20 में नहीं। C ++ 20 अवधारणाओं में, autoफ़ंक्शन पैरामीटर प्रकार में केवल शीर्ष स्तर पर अनुमति है। संबंधित नियम [dcl.spec.auto] पैराग्राफ 2 है :

एक प्लेसहोल्डर प्रकार-विनिर्देशक फार्म के प्रकार बाधा [ऑप्ट] autoएक के रूप में इस्तेमाल किया जा सकता डीईसीएल-विनिर्देशक की डीईसीएल-विनिर्देशक-सेक एक के पैरामीटर-घोषणा एक समारोह घोषणा या की लैम्ब्डा अभिव्यक्ति अगर यह नहीं है, और auto टाइप- स्पेसियर एक अनुगामी-रिटर्न-प्रकार पेश करता है (नीचे देखें), फ़ंक्शन घोषणा या लैम्ब्डा-अभिव्यक्ति का एक सामान्य पैरामीटर प्रकार प्लेसहोल्डर है। [नोट: जेनेरिक पैरामीटर टाइप प्लेसहोल्डर यह दर्शाता है कि फ़ंक्शन एक संक्षिप्त फ़ंक्शन टेम्प्लेट है (9.3.3.5 [dcl.fct]) या लैम्बडा एक जेनेरिक लैम्ब्डा (7.5.5 [expr.prim.lambda]) है। ध्यान दें]

(यदि आप लेखन के समय सबसे हाल के कामकाजी मसौदे में शब्दांकन की जांच करते हैं, तो आपको कुछ अलग नियम मिलेगा। उपरोक्त नियम को कोर इश्यू 2447 द्वारा संशोधित किया गया था, जिसे प्राग में C ++ 20 अंतिम मसौदे में वोट दिया गया था। एक सप्ताह पहले समिति की बैठक।)

डीईसीएल-विनिर्देशक एक समारोह पैरामीटर पैरामीटर घोषणा के शुरू में खोजशब्दों और प्रकार के नाम के प्रारंभिक अनुक्रम हैं में है। उपरोक्त नियम autoशीर्ष स्तर पर अनुमति देता है:

void f(auto x);

... लेकिन केवल एक घोषणा के रूप में । autoअनुमति नहीं दी जाती है जब एक घोषणा-निर्दिष्ट के भीतर नेस्टेड किया जाता है :

void f(std::vector<auto> x);

... और पैरामीटर प्रकार में भी कहीं और अनुमति नहीं है:

void f(void (*p)(auto));

वाह, मुझे नहीं पता था कि! वर्तमान में CWG लिंक 404 देता है, तो क्या आप इस प्रतिबंध के लिए संक्षिप्त रूप से व्याख्या कर सकते हैं?
LF

यह सरासर निराशाजनक है।
फ्यूरिश

1
क्षमा करें, सीडब्ल्यूजी मुद्दा और इसका शब्दांकन सार्वजनिक रूप से अभी तक दिखाई नहीं दे रहा है। विचाराधीन नियम को open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1141r2.html द्वारा पेश किया गया था और इरादे / औचित्य के साथ संगत होना था जो हमने पहले से ही जेनेरिक लैंबडास के लिए अनुमति दी थी।
रिचर्ड स्मिथ

4
@ एलएफ: सीडब्ल्यूजी मुद्दा वैसे भी वास्तव में प्रासंगिक नहीं है: इसने एक शब्दांकन त्रुटि को ठीक कर दिया है जिसका अर्थ है कि autoइस प्रकार के autoउपयोग के रूप में गिना जाने वाले अनुगामी रिटर्न प्रकार के लिए कुछ निश्चित उपयोग।
डेविस हेरिंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.