C++ left arrow operator (2016)
चंचल और “दुष्ट” C++ मुहावरे
- थ्रेड एक कस्टम left-arrow operator पर प्रतिक्रिया देता है, जिसे मज़ेदार, चतुर, और थोड़ा भयावह माना जाता है।
- अन्य “दुष्ट” पैटर्नों का भी उल्लेख है:
delete thisकॉल करना, मैन्युअली destructor कॉल करके फिरthisपर placement-new करना, और intrusive reference counting। - कुछ लोगों का तर्क है कि
delete thisintrusive ref-counted ऑब्जेक्ट्स या COM-शैलीReleaseके लिए स्वीकार्य है, जबकि अन्य ऐसे पैटर्न छिपाने के लिए smart pointers को पसंद करते हैं। - Affine/move-type भाषाएँ (जैसे Rust) “destroying this” को मैन्युअल memory
deleteकी तुलना में वैचारिक रूप से अधिक सुरक्षित बनाती हैं, ऐसा कहा गया है।
Operator Overloading: शक्ति बनाम दुरुपयोग
- कई लोग operator overloading को तब ठीक मानते हैं जब उसे सलीके से इस्तेमाल किया जाए; दुरुपयोगों को अपवाद, नहीं कि नियम, कहा जाता है।
- विवादास्पद या चंचल उपयोगों के उदाहरण:
- streams, network messages, और container insertion के लिए
<</>>। - GUI widgets को compose करने के लिए
+। - RAII guards के लिए
*। - filesystem paths के लिए
/। - “analog literals” और arrow-like या tadpole operators जैसे विचित्र निर्माण।
- streams, network messages, और container insertion के लिए
- कुछ लोग libraries (जैसे linear algebra के लिए) की प्रशंसा करते हैं, जहाँ operators पठनीयता में भारी सुधार करते हैं।
- अन्य लोग तर्क देते हैं कि operators सामान्यतः एक design mistake थे: बहुत सारे संभावित semantics (overflow behavior, आदि) और named functions की तुलना में कमजोर readability।
Iostreams और Formatting
- I/O के लिए
<<के उपयोग की आलोचना की जाती है, क्योंकि यह एक खराब design है जो standard library से आगे नहीं फैला। - कुछ लोगों की format-string APIs (
std::format/std::print,printf-style, याfmtlibrary) के प्रति मजबूत प्राथमिकता है, क्योंकि वे उपयोगिता और type safety देती हैं। - प्रत्युत्तर: iostream की समस्याएँ मुख्यतः operator overloading से असंबंधित हैं।
Functors, Lambdas, और Operator()
- Overloaded
operator()ने ऐतिहासिक रूप से functors/closures को सक्षम किया; lambdas अब अधिकांश use cases को कवर कर लेते हैं। - फिर भी, कुछ patterns के लिए custom functor types आवश्यक माने जाते हैं (जैसे
std::functioninternals, multi-overload visitors, व्यवहार वाले destructors)।
Pointers-to-Members और Delegates
- C++ pointers-to-members को भ्रमित करने वाला और implementation-defined बताया गया है।
- एक दृष्टिकोण शुरू में (बाद में नरम किया गया) उन्हें instance pointer और function के “pair” के रूप में देखता है; अन्य लोग ज़ोर देते हैं कि इनमें कोई instance state नहीं होती और ये केवल offsets/dispatch data encode करते हैं।
- अन्य भाषाओं (D, C#, Virgil, Delphi, Python) के “delegate” या “fat pointer” mechanisms से तुलना:
- Fat pointers को उनकी सरलता और first-class closures के लिए सराहा जाता है।
- C++ का अधिक lean model अधिक लचीला और सस्ता माना जाता है, जो “don’t pay for what you don’t use” के अनुरूप है, जबकि ज़रूरत पड़ने पर
std::functionएक भारी abstraction के रूप में उपलब्ध है।
- performance trade-offs, virtual dispatch, inlining, और compilation models पर बहस उभरती है।
C++ और Operators पर सामान्य विचार
- कुछ टिप्पणीकार C++ की शक्ति और रचनात्मकता के प्रति स्नेह व्यक्त करते हैं; अन्य इसे अत्यधिक जटिल, यहाँ तक कि “comedy” या “abominable” कहते हैं।
- चतुर अभिव्यक्तिशीलता (custom operators, tricks) और दीर्घकालिक code readability तथा maintainability के बीच बार-बार तनाव दिखाई देता है।