एक इंजेक्शन वर्ग का नाम क्यों है?


147

हाल ही में, मैंने एक अजीब सी ++ सुविधा देखी: इंजेक्शन का नाम

class X { };
X x1;
class X::X x2; // class X::X is equal to X
class X::X::X x3; // ...and so on...

लेकिन मैं यह पता नहीं लगा सकता कि यह सुविधा क्यों आवश्यक है। क्या कोई ऐसी प्रैक्टिस है जिसके लिए इस सुविधा की आवश्यकता है?

और मैंने सुना है कि यह सुविधा पुराने C ++ में मौजूद नहीं थी। फिर, इसे कब पेश किया गया था? सी ++ 03? सी ++ 11?


दोस्त, क्या आप स्काइप पर देख सकते हैं? मैं आप तक नहीं पहुँच सकता
इरिनिल इवान

जवाबों:


162

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

void X() { }
class X {
public:
  static X create() { return X(); }
};

क्या create()फ़ंक्शन एक अस्थायी Xऑब्जेक्ट बना रहा है या फ़ंक्शन को कॉल कर रहा है X? नाम स्थान के दायरे में यह कार्य कहेगा, इसलिए इंजेक्शन-वर्ग-नाम का उद्देश्य यह सुनिश्चित करना है कि Xनाम के शरीर के भीतर हमेशा वर्ग खुद को ढूंढता है (क्योंकि नाम का पता लगने से पहले वर्ग 'स्वयं के दायरे में शुरू होता है' गुंजाइश)।

यह क्लास के टेम्प्लेट के अंदर भी मददगार है, जहाँ इंजेक्ट किए गए क्लास के नाम को टेम्प्लेट तर्क-वितर्क सूची के बिना इस्तेमाल किया जा सकता है, जैसे Fooकि फुल टेम्प्लेट-आईडी के बजाय बस Foo<blah, blah, blah>का उपयोग करना, इसलिए वर्तमान तात्कालिकता को संदर्भित करना आसान है। C ++ 98 और C ++ 03 के बीच परिवर्तन के लिए DR 176 देखें, जिसने स्पष्ट किया है।

इंजेक्टेड क्लास नाम का विचार C ++ 98 में मौजूद था, लेकिन C ++ 03 के लिए शब्दावली नई थी।

C ++ 98 कहता है:

एक वर्ग-नाम उस दायरे में डाला जाता है जिसमें वर्ग-नाम देखे जाने के तुरंत बाद घोषित किया जाता है। क्लास-नेम को भी क्लास के दायरे में ही डाला जाता है।

दूसरा वाक्य DR 147 द्वारा बदल दिया गया था, इसलिए C ++ 03 में कहा गया है: [वर्ग] / 2:

एक वर्ग-नाम उस दायरे में डाला जाता है जिसमें वर्ग-नाम दिखने के तुरंत बाद घोषित किया जाता है। वर्ग-नाम भी वर्ग खुद के दायरे में डाला जाता है; इसे इंजेक्शन-क्लास-नाम के रूप में जाना जाता है ।

सी ++ 98 से पहले भी, एआरएम के पास लगभग बराबर शब्द है जिसका अर्थ है कि कक्षा के नाम का उपयोग हमेशा क्लास बॉडी में किया जा सकता है:

एक वर्ग के नाम को वर्ग-नाम के रूप में भी उपयोग किया जा सकता है, यहां तक कि वर्ग निर्दिष्ट सदस्य की सूची के भीतर भी ।

  • उदाहरण के लिए,

    class link { link* next; };


2
मुझे लगता है कि बहुत बार पूछा गया, लेकिन समस्या को इंगित करते हुए एक सरल उदाहरण का निर्माण कभी नहीं किया जा सकता है। तो उदाहरण के लिए +1।
dhein

1
यह स्पष्ट रूप से देखा जा सकता है यदि आप clang ++ your_program.cpp -Xclang-ast- डंप चलाते हैं और आप अपनी कक्षा और फिर एक इंजेक्टेड क्लास चाइल्ड नोड देखते हैं।
xaxxon
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.