2014-12-18 5 views
21

operator""sstd::string के लिए उपयोग करने के लिए आपको using namespace std::string_literals करना होगा। लेकिन उपयोगकर्ता परिभाषित अक्षर जो _ से शुरू नहीं होते हैं, आरक्षित हैं, इसलिए संभव संघर्ष एक बहाना नहीं हो सकता है। अन्य operator""sstd::chrono से है लेकिन यह int अक्षर के लिए है, इसलिए वहां कोई संघर्ष नहीं है।ऑपरेटर को नामस्थान में क्यों छुपाया गया है?

इसका क्या कारण है?

+0

ओह मैन ... मुझे इसके बारे में एक बात देखना याद है, या तो सीपीपीकॉन या बूस्टकॉन, लेकिन मुझे याद नहीं है कि यह क्यों था। – Borgleader

+0

जबकि मुझे सही कारण पता नहीं है, तो ऐसा लगता है कि वैश्विक नामस्थान को प्रदूषित करने से बचने के लिए उचित लगता है, जो इतना छोटा प्रत्यय है। – Aleph

+1

@ बॉर्गलीडर https://www.youtube.com/watch?v=dTeKf5Oek2c यह वीडियो की शुरुआत में है। –

उत्तर

19

वहाँ वास्तव में दो कारण शाब्दिक नामस्थान में डाल दिया जाता है:

  1. यह अवांछनीय है कि उपयोगकर्ताओं को using namespace std; का उपयोग सिर्फ इसी शाब्दिक की पकड़ पाने के लिए होगा माना जाता है। इनमें से विशिष्ट नामस्थानों में घोषित शाब्दिक होने से समस्या का कारण नहीं बनता है।
  2. डोमेन के आधार पर s का उपयोग किसी और चीज के लिए प्रत्यय के रूप में करना वांछनीय हो सकता है। सेकेंड के लिए पहले से ही एक और प्रत्यय s है लेकिन वे वास्तव में संघर्ष नहीं करते हैं।

video of STL's CppCon 2014 talk में (एक टिप्पणी में remyable द्वारा पोस्ट की गई) स्टीफ़न टी Lavavej सी ++ 14 और उसके बहुत स्पष्ट में शाब्दिक के समग्र डिजाइन बताते हैं कि वे नहीं ग्लोबल नेम स्पेस में होना चाहिए रहे हैं ! इसके बजाए, मानक पुस्तकालय में शाब्दिक प्रत्यय inline नामस्थानों के पदानुक्रम में रहते हैं जो उपयोगकर्ताओं को उपलब्ध कराए जा रहे साक्षरियों पर सुदृढ़ नियंत्रण प्रदान करते हैं। उदाहरण के लिए, तार के लिए शाब्दिक प्रत्यय इस तरह घोषित किया जाता है (21.3 [string.classes] पैराग्राफ 1):

namespace std { 
    inline namespace literals { 
     inline namespace string_literals { 
      string operator"" s(char const* str, size_t len); 
     } 
    } 
} 

inline नामस्थान के इस पदानुक्रम यह संभव उपयोगकर्ताओं शाब्दिक प्रत्यय उपयुक्त विकल्प पाने के लिए बनाता है:

  • using namespace std; - आपको बिना किसी योग्यता के शाब्दिक प्रत्यय समेत मानक सी ++ लाइब्रेरी में सबकुछ मिलता है।
  • using namespace std::literals; - आपको मानक सी ++ लाइब्रेरी में परिभाषित सभी शाब्दिक प्रत्यय प्राप्त होते हैं।
  • using namespace std::string_literals; - आपको स्ट्रिंग पर लागू सभी शाब्दिक प्रत्यय मिलते हैं।
  • using namespace std::literals::string_literals; - हाँ, आप ऐसा कर सकते हैं लेकिन आपको वास्तव में यह नहीं करना चाहिए: यह using namespace std::string_literals; के बराबर है।

जाहिर है, समिति, कि बहुत प्रयास करने के लिए नहीं गए हैं अगर यह विचार सिर्फ शाब्दिक प्रत्यय के साथ वैश्विक नामस्थान को दूषित करने के लिए व्यवहार्य माना जाता था, हालांकि वे भी किसी भी उपयोगकर्ता शाब्दिक प्रत्यय के साथ संघर्ष नहीं कर सकते।

+0

मुझे विश्वास नहीं है। उपयोगकर्ता गैर-मानक लाइब्रेरी कोड वैसे भी 'ऑपरेटर "" एस' घोषित नहीं कर सकता है, या यह कर सकता है? – milleniumbug

+1

@ मिलिनेंबग: सही: उपयोगकर्ता द्वारा परिभाषित अक्षर को '_' से शुरू करने की आवश्यकता है।संबोधित संघर्ष उपयोगकर्ता कोड के साथ नहीं बल्कि अन्य मानक पुस्तकालय वर्गों के साथ है। ऑफ-हाथ मैं एक दृढ़ उदाहरण के बारे में नहीं सोच सकता लेकिन एक बार जब हमें नेटवर्किंग लाइब्रेरी मिलती है तो यह 127.0.0.1:80 "s' का उपयोग करके सॉकेट बनाने के लिए अच्छा हो सकता है। ... और दूसरा तर्क, 'नेमस्पेस std का उपयोग करके' प्रदूषण कोड को अनिवार्य नहीं करना चाहता, वैसे भी: जहां तक ​​मुझे पता है कि आप केवल शाब्दिक ऑपरेटर के लिए 'घोषणा' का चयन कर सकते हैं। –

+1

@ मिलिनेंबग प्रस्तावित 'स्ट्रिंग_व्यू' '' 'शब्दशः के लिए एक और संभावित उम्मीदवार है, हालांकि इसने संघर्ष से बचने के लिए अतीत में' sv 'भी प्रयोग किया है। (वर्तमान मसौदे में इसका कोई शाब्दिक ऑपरेटर नहीं है।) कोई समाधान नहीं है कि कौन सा समाधान, यदि कोई है, तो बनाए रखा जाएगा (उदाहरण के लिए अलग-अलग नामस्थानों में समवर्ती ''' 'शब्दशः या अन्यथा)। –

संबंधित मुद्दे