sirve que para funcion entre diferencias descargar c_str c++ string c++11 c++03 c-str

que - Diferencia en la especificación de la función c_str entre C++ 03 y C++ 11



diferencias entre c++ y c++ 11 (3)

En la reference de C ++ de c_str() en std::string aparece lo siguiente:

Valor de retorno
Puntero al almacenamiento de caracteres subyacente.
data()[i] == operator[](i) for every i in [0, size()) (hasta C ++ 11)
data() + i == &operator[](i) for every i in [0, size()] (desde C ++ 11)

No entiendo la diferencia entre los dos, excepto por el aumento del rango en un elemento desde C ++ 11.

¿No son los data()[i] == operator[](i) declaración anterior data()[i] == operator[](i) también verdaderos para el segundo?


Antes de C ++ 11, no se especificaba si los datos de la cadena estaban terminados en nulo o no. C ++ 11 dice que debe tener una terminación nula.


Excepto por el incremento del rango en un elemento desde C ++ 11, todavía hay una gran diferencia entre:

data()[i] == operator[](i)

y:

data() + i == &operator[](i)

Esa diferencia principal es el operador & en los prototipos.

El antiguo prototipo, permitía que se hiciera una copia cuando se produciría una operación de escritura, ya que el puntero devuelto podría apuntar a un búfer diferente al que contiene la cadena original.

La otra diferencia en los prototipos entre data()[i] y data() + i , no es crítica, ya que son equivalent .

Una diferencia entre C ++ y C ++ 11 es que en el primero, el estándar no especificaba explícitamente una std::string para determinar si tendría un terminador nulo o no. En este último sin embargo, esto se especifica.

En otras palabras: ¿std :: string siempre terminará en nulo en C ++ 11? Sí.


Tenga en cuenta la diferencia de cierre de cierre:

[0, tamaño () )

[0, tamaño () ]

Primero representa el rango exclusivo (es decir, el ítem en el índice de size no está incluido) mientras que el segundo representa el rango inclusivo (es decir, el ítem en el índice de size está incluido). El carácter de acceso a +11 en la posición de size() está bien definido.

En cuanto a la diferencia entre los data()[i] == operator[](i) y data() + i == &operator[](i) el segundo aplica más restricciones sobre la implementación potencial. En el primer caso, un puntero a búfer devuelto por data() puede ser diferente del puntero a búfer donde se almacena un valor a la referencia a la que devolvió el operator [] . Esto podría suceder cuando se creó un nuevo búfer después de la invocación del operador no calificado por completo [] de la cadena copiada.