C ++ ऑटो कीवर्ड। यह जादू क्यों है?


145

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

अचानक एसटीएल पुनरावृत्तियों और, ठीक है, सभी कुछ है कि टेम्पलेट्स का उपयोग करता है लिखने के लिए 10 गुना आसान है। ऐसा लगता है कि मैं पायथन की तरह एक 'मजेदार' भाषा का उपयोग कर रहा हूं।

यह खोजशब्द मेरा पूरा जीवन कहाँ रहा है? क्या आप यह कहकर मेरे सपनों को धराशायी कर देंगे कि यह दृश्य स्टूडियो के लिए अनन्य है या पोर्टेबल नहीं है?


18
यह। जादू। यह नया है ( ओह नो, क्या बुरा वाक्य है )। अब async भविष्य (है हांफी )
sehe

2
यहाँ ऑटो कीवर्ड en.cppreference.com/w/cpp/language/auto
andyqee

जवाबों:


149

auto एक कीवर्ड था जो C ++ से "विरासत में मिला" था, जो लगभग हमेशा के लिए था, लेकिन लगभग कभी भी इस्तेमाल नहीं किया गया क्योंकि केवल दो संभावित स्थितियां थीं: या तो इसकी अनुमति नहीं थी, या फिर डिफ़ॉल्ट रूप से इसे ग्रहण किया गया था।

autoC ++ 11 के साथ माध्यित प्रकार का उपयोग करने का अर्थ नया था।

इसी समय, auto x = initializerके प्रकार के deduces xके प्रकार से initializerसमारोह टेम्पलेट्स के लिए टेम्पलेट प्रकार कटौती काम करता है के रूप में एक ही तरह से। इस तरह एक समारोह टेम्पलेट पर विचार करें:

template<class T>
int whatever(T t) { 
    // point A
};

बिंदु A पर, Tपैरामीटर के लिए पारित मूल्य के आधार पर एक प्रकार सौंपा गया है whatever। जब आप ऐसा करेंगे auto x = initializer;, एक ही प्रकार कटौती के लिए प्रकार का निर्धारण करने के लिए प्रयोग किया जाता है xसे के प्रकार initializerहै कि यह प्रारंभ करने में प्रयोग किया जाता है।

इसका मतलब यह है कि अधिकांश प्रकार की कटौती यांत्रिकी को लागू करने के लिए एक कंपाइलर की आवश्यकता होती है autoऔर पहले से ही किसी भी कंपाइलर पर टेम्पलेट्स के लिए उपयोग किया जाता था जो कि C ++ 98/03 को लागू करने का प्रयास भी करते थे। जैसे, autoअनिवार्य रूप से सभी संकलक टीमों के लिए समर्थन को जोड़ना काफी आसान था - इसे काफी तेज़ी से जोड़ा गया था, और लगता है कि इससे संबंधित कुछ कीड़े भी थे।

जब यह उत्तर मूल रूप से लिखा गया था (2011 में, C ++ 11 मानक पर स्याही सूखने autoसे पहले ) काफी पोर्टेबल था। आजकल, यह सभी मुख्यधारा के संकलक के बीच पूरी तरह से पोर्टेबल है। इससे बचने के लिए केवल स्पष्ट कारण हैं यदि आपको कोड लिखने की आवश्यकता है जो कि सी कंपाइलर के साथ संगत है, या आपको कुछ आला कंपाइलर को लक्षित करने की विशिष्ट आवश्यकता है जो आपको पता है कि यह समर्थन नहीं करता है (उदाहरण के लिए, कुछ लोग अभी भी कोड लिखते हैं। बोरलैंड, वाटकॉम, आदि से कंपाइलरों का उपयोग करते हुए एमएस-डॉस के लिए, जो दशकों में महत्वपूर्ण उन्नयन नहीं देखा है)। यदि आप किसी भी मुख्य धारा के संकलक के वर्तमान संस्करण का उपयोग कर रहे हैं, तो इससे बचने का कोई कारण नहीं है।


24

यह सिर्फ एक आम तौर पर बेकार कीवर्ड ले रहा है और इसे एक नया, बेहतर कार्यक्षमता दे रहा है। यह C ++ 11 में मानक है, और कुछ C ++ 11 समर्थन के साथ अधिकांश C ++ कंपाइलर इसका समर्थन करेंगे।


ओह! अहा, सी ++ के बारे में कभी नहीं सोचा था कि भाषा एक ऐसी चीज है जो अपने आप में और बदल सकती है। मुझे यह देखना होगा कि इस C ++ 11 में उन्होंने और क्या जोड़ा है, मैंने एक C ++ 0x का थोड़ा सा सुना, लेकिन कभी भी इसमें गहराई तक नहीं खोदा।
ऐनी क्विन

7
@Clairvoire C ++ 0x अंतरिम नाम था। यह इस महीने प्रकाशित हुआ है, और इस तरह C ++ 11 बन गया है।
आर। मार्टिनो फर्नांडिस

13

चर के लिए, निर्दिष्ट करता है कि जिस प्रकार का चर घोषित किया जा रहा है, वह अपने इनिशियलाइज़र से स्वचालित रूप से कट जाएगा। फ़ंक्शंस के लिए, निर्दिष्ट करता है कि रिटर्न प्रकार एक अनुगामी रिटर्न प्रकार है या इसके रिटर्न स्टेटमेंट (C ++ 14 के बाद से) से काट लिया जाएगा।

वाक्य - विन्यास

auto variable initializer   (1) (since C++11)

auto function -> return type    (2) (since C++11)

auto function   (3) (since C++14)

decltype(auto) variable initializer (4) (since C++14)

decltype(auto) function (5) (since C++14)

auto :: (6) (concepts TS)

cv(optional) auto ref(optional) parameter   (7) (since C++14)

व्याख्या

1) ब्लॉक स्कोप में वेरिएबल्स की घोषणा करते समय, नेमस्पेस स्कोप में, लूप्स के लिए इनिशियलाइज़ेशन स्टेटमेंट में, आदि, कीवर्ड ऑटो को टाइप स्पेसियर के रूप में इस्तेमाल किया जा सकता है। एक बार जब इनिशलाइज़र का प्रकार निर्धारित किया गया है, तो कंपाइलर उस प्रकार को निर्धारित करता है जो एक फ़ंक्शन कॉल से टेम्पलेट तर्क कटौती के नियमों का उपयोग करके कीवर्ड ऑटो को बदल देगा (टेम्पलेट तर्क कटौती # विवरण के लिए अन्य संदर्भ) देखें। कीवर्ड ऑटो मॉडिफ़ाइड के साथ हो सकता है, जैसे कि कॉन्स्ट या; जो कि प्रकार की कटौती में भाग लेंगे। उदाहरण के लिए, दिया गया const auto& i = expr;, i का प्रकार एक काल्पनिक टेम्पलेट में तर्क यू का प्रकार हैtemplate<class U> void f(const U& u) में फ़ंक्शन कॉल करता हैf(expr)संकलित किया गया था। इसलिए, ऑटो और& को या तो एक लैवल्यू रेफ़रेंस के रूप में या रैवल्यू रेफ़रेंस के अनुसार घटाया जा सकता है, जिसका उपयोग लूप के लिए रेंज-बेस्ड में किया जाता है। यदि ऑटो का उपयोग कई चर घोषित करने के लिए किया जाता है, तो कटौती प्रकार मेल खाना चाहिए। उदाहरण के लिए, घोषणा auto i = 0, d = 0.0;बीमार है, जबकि घोषणा auto i = 0, *p = &i;अच्छी तरह से बनाई गई है और ऑटो को int के रूप में घटाया गया है।

2) एक फ़ंक्शन घोषणा में जो ट्रेलिंग रिटर्न प्रकार सिंटैक्स का उपयोग करता है, कीवर्ड ऑटो स्वचालित प्रकार का पता लगाने का प्रदर्शन नहीं करता है। यह केवल वाक्य रचना के एक भाग के रूप में कार्य करता है।

3) एक फ़ंक्शन घोषणा में जो अनुगामी रिटर्न प्रकार सिंटैक्स का उपयोग नहीं करता है, कीवर्ड ऑटो इंगित करता है कि वापसी प्रकार टेम्पलेट तर्क कटौती के लिए नियमों का उपयोग करके अपने रिटर्न स्टेटमेंट के ऑपरेंड से काट लिया जाएगा।

4) यदि घोषित प्रकार का वैरिएबल (ऑटो) डिक्लेयर है, तो कीवर्ड ऑटो को उसके इनिशियलाइज़र के एक्सप्रेशन (या एक्सप्रेशन लिस्ट) से बदल दिया जाता है, और वास्तविक प्रकार डिक्लेपट के नियमों का उपयोग करके घटाया जाता है।

5) यदि फ़ंक्शन का रिटर्न प्रकार घोषित किया जाता है, तो ऑटो (कीवर्ड) को उसके रिटर्न स्टेटमेंट के ऑपरेंड के साथ बदल दिया जाता है, और वास्तविक रिटर्न प्रकार को डिस्क्रिप्टी के नियमों का उपयोग करके घटा दिया जाता है।

6) फॉर्म ऑटो का नेस्टेड-नेम-स्पेसिफ़ायर :: एक प्लेसहोल्डर है जिसे विवश टाइप प्लेसहोल्डर कटौती के नियमों के अनुसार एक वर्ग या गणना प्रकार द्वारा प्रतिस्थापित किया जाता है।

7) एक लंबोदर अभिव्यक्ति में एक पैरामीटर घोषणा। (C ++ 14 के बाद से) एक फ़ंक्शन पैरामीटर घोषणा। (अवधारणा टीएस)

नोट्स सी ++ 11 तक, ऑटो एक भंडारण अवधि विनिर्देशक का अर्थ था। ऑटो वैरिएबल और फ़ंक्शंस को एक घोषणा में मिलाना, जैसा auto f() -> int, i = 0;कि अनुमति नहीं है।

अधिक जानकारी के लिए: http://en.cppreference.com/w/cpp/language/auto


11

यह कार्यक्षमता आपके पूरे जीवन में नहीं रही है। यह 2010 के संस्करण के बाद से विजुअल स्टूडियो में समर्थित है। यह एक नया C ++ 11 फीचर है, इसलिए यह विज़ुअल स्टूडियो के लिए अनन्य नहीं है और यह पोर्टेबल होगा। अधिकांश संकलक पहले से ही इसका समर्थन करते हैं।


3

यह कहीं भी नहीं जा रहा है ... यह C ++ 11 के कार्यान्वयन में एक नया मानक C ++ सुविधा है। यह कहा जा रहा है, जबकि यह वस्तु घोषणाओं को सरल बनाने के साथ-साथ कुछ कॉल-प्रतिमानों के लिए वाक्यविन्यास को साफ करने का एक अद्भुत उपकरण है (यानी, रेंज-आधारित-लूप के लिए), इसका अधिक उपयोग / दुरुपयोग न करें :-)


3

ऑटो कीवर्ड निर्दिष्ट करता है कि जिस प्रकार का चर घोषित किया जा रहा है, वह अपने इनिशियलाइज़र से स्वचालित रूप से कट जाएगा। फ़ंक्शंस के मामले में, यदि उनका रिटर्न प्रकार ऑटो है तो रनटाइम में रिटर्न टाइप एक्सप्रेशन द्वारा मूल्यांकन किया जाएगा।

यह बहुत उपयोगी हो सकता है जब हमें पुनरावृत्त का उपयोग करना होगा। नीचे दिए गए कोड के लिए उदाहरण के लिए, हम पूरे इटैलर सिंटैक्स को लिखने के बजाय "ऑटो" का उपयोग कर सकते हैं।

int main() 
{ 

// Initialize set 
set<int> s; 

s.insert(1); 
s.insert(4); 
s.insert(2); 
s.insert(5); 
s.insert(3); 

// iterator pointing to 
// position where 2 is 
auto pos = s.find(3); 

// prints the set elements 
cout << "The set elements after 3 are: "; 
for (auto it = pos; it != s.end(); it++) 
    cout << *it << " "; 

return 0; 
}

इस प्रकार हम "ऑटो" कीवर्ड का उपयोग कर सकते हैं


0

यह जादू है यह विशिष्ट कार्यों में पारित हर परिवर्तनीय प्रकार के लिए कोड लिखने को कम करने की क्षमता है। एक पायथन समान प्रिंट () फ़ंक्शन पर विचार करें यह सी बेस है।

#include <iostream>
#include <string>
#include <array>

using namespace std;

void print(auto arg) {
     cout<<arg<<" ";
}

int main()
{
  string f = "String";//tok assigned
  int x = 998;
  double a = 4.785;
  string b = "C++ Auto !";
//In an opt-code ASCII token stream would be iterated from tok's as:
  print(a);
  print(b);
  print(x);
  print(f);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.