C++ left arrow operator (2016)

चंचल और “दुष्ट” C++ मुहावरे

  • थ्रेड एक कस्टम left-arrow operator पर प्रतिक्रिया देता है, जिसे मज़ेदार, चतुर, और थोड़ा भयावह माना जाता है।
  • अन्य “दुष्ट” पैटर्नों का भी उल्लेख है: delete this कॉल करना, मैन्युअली destructor कॉल करके फिर this पर placement-new करना, और intrusive reference counting।
  • कुछ लोगों का तर्क है कि delete this intrusive 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 जैसे विचित्र निर्माण।
  • कुछ लोग 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, या fmt library) के प्रति मजबूत प्राथमिकता है, क्योंकि वे उपयोगिता और type safety देती हैं।
  • प्रत्युत्तर: iostream की समस्याएँ मुख्यतः operator overloading से असंबंधित हैं।

Functors, Lambdas, और Operator()

  • Overloaded operator() ने ऐतिहासिक रूप से functors/closures को सक्षम किया; lambdas अब अधिकांश use cases को कवर कर लेते हैं।
  • फिर भी, कुछ patterns के लिए custom functor types आवश्यक माने जाते हैं (जैसे std::function internals, 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 के बीच बार-बार तनाव दिखाई देता है।