2011-05-20 14 views
43

Herb Sutter şöyle demektedir:std :: string her zaman C++ 11'de null olarak sonlandırılacak mı? Onun sitesinde 2008 gönderide

C++ 0x ile daha da bu kadar sıkın ve boş-feshini gerektirir ve muhtemelen kopya üzerinde yazma yasaklanması için aktif bir öneri yoktur eşzamanlılık ile ilgili nedenlerden dolayı uygulamalar. İşte kağıt: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2534.html. Bu makaledeki tekliflerden birinin veya her ikisinin de kabul edileceğini düşünüyorum, ancak bir sonraki toplantıda veya ikide görüşeceğiz.

Şu anda C++ 11'in, std :: string içeriğinin bitişik olarak saklanmasını garanti ettiğini biliyorum, ancak yukarıdaki taslağı yukarıdaki taslağa aldılar mı?

&str[0] gibi bir şey kullanmak artık güvenli midir?

+0

İçeriğin saklı olarak saklandığını garanti etmek C++ 03'te de sağlanıyor mu? – triclosan

cevap

45

Evet. C++ 0x FDIS 21.4.7.1/1 başına, std::basic_string::c_str()[0,size()] içinde

her i için bir işaretçi p şekilde p + i == &operator[](i) döndürmelidir.

Bu demektir ki, verilen bir dizi s, ip (&s[0]) ilk karakter adresi ile aynı olmalıdır s.c_str() tarafından döndürülen işaretçi.

+4

Aynı gereksinimin C++ 98/03 için doğru olmadığına inandığım "data" için de geçerli olduğunu unutmayın. – Xeo

+6

Evet, 'basic_string <> :: c_str() 've' basic_string <> :: data() 'nın artık tam olarak aynı semantiklere sahip olduğunu görüyoruz. – ildjarn

+14

Bu, yazının başlığını taşıyan soruyu yanıtlamıyor - yani "Will' std :: string "her zaman C++ 11'de null olarak sonlandırılıyor mu?", Bu durumda cevap hayır. Operatör [str.length()] '' \ 0 'i döndürecektir, ancak bu 'string'in aslında bellekte içerdiği anlamına gelmez. –