2011-05-20 10 views
43

En un post 2008 en su sitio, Herb Sutter indica lo siguiente:Will std :: string siempre tendrá terminación nula en C++ 11?

Hay una propuesta activa para apretar aún más esto en C++ 0x y requieren nulo de terminación y posiblemente prohibir la copia en escritura implementaciones, por razones relacionadas con la concurrencia. Aquí está el papel: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2534.html. Creo que una o ambas de las propuestas en este documento es probable que se adopten, pero veremos en la próxima reunión o dos.

Sé que C++ 11 ahora garantiza que los contenidos de std :: string se almacenen de forma contigua, pero ¿adoptaron los anteriores en el borrador final?

¿Será seguro usar algo como &str[0]?

+0

¿La garantía de que los contenidos almacenados de forma contigua se proporciona también en C++ 03? – triclosan

Respuesta

45

Sí. Por el C++ 0x FDIS 21.4.7.1/1, std::basic_string::c_str() deben volver

un puntero p tal que p + i == &operator[](i) para cada i en [0,size()].

Esto significa que, dada una cadena s, el puntero devuelto por s.c_str() debe ser la misma que la dirección del carácter inicial en la cadena (&s[0]).

+4

Tenga en cuenta que el mismo requisito es válido para 'datos', que creo que no era cierto para C++ 98/03. – Xeo

+6

Sí, es esclarecedor que 'basic_string <> :: c_str()' y 'basic_string <> :: data()' ahora tienen una semántica exactamente idéntica. – ildjarn

+14

Esto no parece responder a la pregunta con la que se titula la publicación, es decir, "¿Will' std :: string' siempre tendrá terminación nula en C++ 11? ", En cuyo caso la respuesta es no. 'operator [str.length()]' devolverá ''\ 0'', pero eso no significa que' string' en realidad lo contenga en la memoria. –

Cuestiones relacionadas