String::c_str() artık boş C 11'de sonlandırıldı?
C 11 basic_string::c_str
tanımlanmış olmak tam olarak aynı basic_string::data
, hangi sırayla tanımlı olmak tam olarak aynı *(begin() n)
*(&*begin() n)
(0 <= n < size()
).
Ben her zaman onun dize sonuna bir boş karakter olmasını gerektiren bir şey bulmak.
Bu c_str()
artık boş sonlandırılmış bir dize üretmek için garantili anlamına mı geliyor?
CEVAP
Dizeleri şimdi boş sonlandırılmış tamponlar DAHİLİ olarak kullanmak için gereklidir. operator[]
(21.4.5)bu: tanım
Gerektirir:
pos <= size()
.Verir:
pos < size()
, başka türde bir nesne başvurusu varsa*(begin() pos)
T
değeri ilecharT()
; referans değeri değiştirilemez.
Geri c_str
(21.4.7.1/1), operator[]
açısından tanımlanmış olduğunu görüyoruz:
Verir:
[0,size()]
16 *herp i == &operator[](i)
böyle bir işaretçip
.
c_str
data
hem O olmak için gerekli(1), uygulanması etkin bir şekilde sonlandırılmış tamponlar kullanmak zorunda kalır.
Ayrıca, David Rodríguez - dribeas işaret açıklamalarda, dönüş değeri şartı da demek kullanabileceğiniz &operator[](0)
eşanlamlı c_str()
, sonlandırıcı boş karakter olmalı yalan aynı tampon (beri *(p size())
eşit olmalıdır charT()
); bu da demek oluyor ki bile Terminatör başlatıldığını tembel, mümkün olmadığını gözlemlemek tampon Ara devlet.