हां, यह जानबूझकर है, और ब्रेकेज की संभावना operator&
ओवरलोडेड है।
अपूर्ण प्रकारों का पता लेना सी ++ से बहुत पहले संभव है। सी में, किसी भी ब्रेकेज का बिल्कुल कोई जोखिम नहीं है, क्योंकि &
ओवरलोड नहीं किया जा सकता है।
सी ++ ने पहले वैध प्रोग्रामों को अनावश्यक रूप से तोड़ने का विकल्प नहीं चुना है, और बस निर्दिष्ट किया है कि अगर एक अपूर्ण प्रकार &
ऑपरेटर ओवरलोडेड हो जाता है, तो यह निर्दिष्ट नहीं है कि अधिभारित ऑपरेटर का उपयोग किया जाता है या नहीं।
का हवाला देते हुए N4140:
5.3.1 एकल ऑपरेटरों [expr.unary.op]
तो &
अधूरा वर्ग प्रकार का एक lvalue और पूर्ण प्रकार पर लागू होता है वाणी operator&()
, यह निर्दिष्ट नहीं है कि ऑपरेटर का अंतर्निहित अर्थ है या ऑपरेटर फ़ंक्शन कहा जाता है।
यह एक वर्ग वर्तमान में घोषित किया जा रहा करने के लिए भी लागू करने के लिए व्याख्या की जा सकती है और यहां तक कि जब operator&
की घोषणा पहले से ही देखा गया है:
extern struct A a;
struct A {
int operator&();
decltype(&a) m; // int, or A *?
};
int main() {
return A().m; // only valid if m is int
}
यहाँ, जीसीसी m
प्रकार A *
देता है और कार्यक्रम को खारिज कर दिया , लेकिन क्लैंग इसे int
टाइप करता है और इसे स्वीकार करता है।
मुझे लगता है कि बेहतर सवाल यह है कि "सी ++ पहली जगह में' & 'के ओवरलोडिंग की अनुमति क्यों देता है": डी –
मुझे नहीं पता था कि आप 'ऑपरेटर और() 'अधिभारित कर सकते हैं। कभी-कभी मुझे लगता है कि सी ++ देवताओं को * बहुत अधिक * देता है। – tenfour
@tenfour: मैं सचमुच केवल एक परिस्थिति के बारे में सोच सकता हूं जिसमें यह उपयोगी है, और वह तब होता है जब लैम्ब्डा नोटेशन में ऑपरेशन के पते का प्रतिनिधित्व करता है, उदाहरण के लिए 'Foo [और _ 1]'। – Mehrdad