2016-05-15 20 views
6

निम्न कोड संकलित क्यों करता है? यह क्लैंग और प्रिंटर first. के साथ ठीक से चलाता है और चलाता है, लेकिन मेरा मानना ​​है कि सही व्यवहार शिकायत करना और उचित त्रुटि जारी करना चाहिए।सी ++ std :: स्ट्रिंग प्रारंभिक का गलत व्यवहार

#include <iostream> 
#include <string> 

int main() 
{ 
    std::string s{ "first", "second" }; 
    std::cout << s << std::endl; 
} 

यह प्रश्न this से प्रेरित है।

+0

ऐसा इसलिए है क्योंकि "पहले" स्ट्रिंग के अंत में एक अंतर्निहित "\ 0" है .... जो 'स्ट्रिंग' ऑब्जेक्ट को अधिक वर्णों को ढूंढने से रोकने के लिए कहता है (भले ही यह संभवत: पूर्ण आवंटित हो रहा हो "दूसरा" की स्मृति) – DarthRubik

+1

@DarthRubik: नहीं। ऐसा नहीं हो रहा है। –

+0

अंतर्निहित समस्या [इस सवाल] के समान है (https://stackoverflow.com/questions/24112281/c11-initializer-list-fails-but-only-on-lists-of-length-2)। – chris

उत्तर

9

std::string में एक टेम्पलेट कन्स्ट्रक्टर है जो दो इटरेटर लेता है। जब आप स्ट्रिंग अक्षर पारित करते हैं, तो वे char const* पर क्षय हो जाएंगे, जो एक पुनरावर्तक के रूप में योग्यता प्राप्त करता है। हालांकि, चूंकि वे पॉइंटर्स वैध सीमा नहीं बनाते हैं, इसलिए आपके पास अपरिभाषित व्यवहार है।

+0

फिर, यह झुकाव में एक बग है; क्या वो सही है? –

+0

@EissaN। नहीं। यह आपके कोड में एक बग है। आपका कार्यक्रम अपरिभाषित व्यवहार प्रदर्शित करता है, और इसलिए क्लैंग विशेष रूप से कुछ भी करने का कोई दायित्व नहीं है, और जहां तक ​​सी ++ मानक का संबंध है, कुछ भी कर सकते हैं। –

4

यह अनिर्धारित व्यवहार है।

यह std::string का एक कन्स्ट्रक्टर का आह्वान कर रहा है जो दो पुनरावृत्तियों, शुरुआत और समाप्ति वाले इटरेटर मान को स्वीकार करता है। चूंकि दोनों प्रारंभिक मानदंडों का एक ही प्रकार होता है, इसलिए उन्हें इटरेटर की एक जोड़ी के रूप में व्याख्या किया जाता है, और इस विशेष अधिभारित कन्स्ट्रक्टर से मेल खाता है।

चरित्र पॉइंटर्स के मानों को प्रारंभ/समाप्त करने वाले मानकों के मूल्य के रूप में व्याख्या किया जाता है। यह सिर्फ झुकाव के साथ काम करने के लिए होता है, लेकिन जीसीसी के साथ यह एक अपवाद फेंकता है।

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