2011-05-20 9 views
43

उसकी साइट पर एक 2008 पोस्ट में, हर्ब Sutter निम्नलिखित राज्यों:क्या std :: स्ट्रिंग हमेशा सी ++ 11 में शून्य-समाप्त हो जाएगी?

इस C++ 0x में आगे कसने और अशक्त-समाप्ति की आवश्यकता होती है और संभवतः कॉपी-ऑन-राइट प्रतिबंध लगाने के लिए एक सक्रिय प्रस्ताव है समेकन से संबंधित कारणों के लिए कार्यान्वयन। यहां पेपर है: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2534.html। मुझे लगता है कि इस पेपर में एक या दोनों प्रस्तावों को अपनाया जाने की संभावना है, लेकिन हम अगली बैठक या दो में देखेंगे।

मुझे पता है कि सी ++ 11 अब गारंटी देता है कि std :: स्ट्रिंग सामग्री समीपवर्ती संग्रहीत है, लेकिन वे अंतिम मसौदा में ऊपर अपनाने किया?

क्या अब &str[0] जैसे कुछ का उपयोग करना सुरक्षित होगा?

+0

गारंटी है कि सामग्री को संगत रूप से संग्रहीत सामग्री सी ++ 03 में भी प्रदान की जाती है? – triclosan

उत्तर

45

हां। प्रति C++ 0x एफ डी आई 21.4.7.1/1, std::basic_string::c_str()

[0,size()] में एक सूचक p ऐसी है कि p + i == &operator[](i) प्रत्येक i के लिए लौट जाना चाहिए।

कि इसका मतलब यह है दिया एक स्ट्रिंग s, सूचक s.c_str() द्वारा वापस स्ट्रिंग (&s[0]) में प्रारंभिक चरित्र के पते के समान होना चाहिए।

+4

ध्यान दें कि वही आवश्यकता 'डेटा' के लिए सच है, जो मुझे विश्वास है कि सी ++ 98/03 के लिए सच नहीं था। – Xeo

+6

हां, यह रोशनी है कि 'basic_string <> :: c_str() 'और' basic_string <> :: डेटा() 'अब बिल्कुल समान अर्थशास्त्र है। – ildjarn

+14

यह उस प्रश्न का उत्तर नहीं देता है जिसके साथ पोस्ट शीर्षक है - यानी "क्या' std :: string' हमेशा C++ 11 में शून्य-समाप्त हो जाएगा? ", इस मामले में उत्तर नहीं है। 'ऑपरेटर [str.length()]' '\ 0'' वापस करेगा, लेकिन इसका मतलब यह नहीं है कि 'स्ट्रिंग' वास्तव में इसे स्मृति में शामिल करता है। –

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