c++ - library - ¿Es malo depender del índice 0 de una cadena estándar std vacía?
string c++ library (2)
C ++ 14
No; Puedes depender de ello.
En 21.4.5.2 (o [string.access]) podemos encontrar:
Devuelve:
*(begin() + pos)
ifpos < size()
. De lo contrario, devuelve una referencia a un objeto de tipocharT
con el valorcharT()
, donde la modificación del objeto conduce a un comportamiento indefinido.
En otras palabras, cuando pos == size()
(que es verdadero cuando ambos son 0), el operador devolverá una referencia a un tipo de carácter construido por defecto que está prohibido modificar .
No tiene una caja especial para las cuerdas vacías (o de tamaño 0) y funciona igual para cada longitud.
C ++ 03
Y ciertamente C ++ 98 también.
Depende.
Aquí está 21.3.4.1 de la norma ISO / IEC 14882:
Devuelve: Si
pos < size()
, devuelvedata()[pos]
. De lo contrario, sipos == size()
, la versión const devuelvecharT()
. De lo contrario, el comportamiento es indefinido.
std::string my_string = "";
char test = my_string[0];
He notado que esto no falla, y cada vez que lo he probado, la prueba es 0.
¿Puedo confiar en que siempre sea 0? ¿O es arbitrario?
¿Es esta mala programación?
Edit: De algunos comentarios, deduzco que hay algunos malentendidos acerca de la utilidad de esto.
El propósito de esto NO es verificar si la cadena está vacía. Es para no tener que comprobar si la cadena está vacía.
La situación es que hay una cadena que puede o no estar vacía. Solo me importa el primer carácter de esta cadena (si no está vacío).
Me parece que sería menos eficiente verificar si la cadena está vacía, y luego, si no está vacía, mira el primer carácter.
if (! my_string.empty())
test = my_string[0];
else
test = 0;
En su lugar, solo puedo mirar el primer carácter sin necesidad de verificar si la cadena está vacía.
test = my_string[0];
La answer @Bartek Banachewicz explica qué circunstancias le permiten hacer su suposición. Me gustaría añadir que
Esta es una mala programación.
¿Por qué? Por varias razones:
- Tienes que ser un abogado de idiomas para estar seguro de que esto no es un error. No sabría la respuesta si no fuera por esta página, y francamente, no creo que realmente deba molestarse en saberlo tampoco.
- Las personas sin la intuición de que una cadena sea una secuencia de caracteres terminada en nulo no tendrán idea de lo que estás tratando de hacer hasta que lean el estándar o pregunten a sus amigos.
- Rompe el principio de menos sorpresa de una manera mala.
- Va en contra del principio de "escribir lo que quiere decir", es decir, que el código exprese los conceptos del dominio del problema.
- Tipo de uso de un número mágico (es discutible si 0 en realidad constituye un número mágico en este caso).
¿Continúo? ... Estoy casi seguro de que tienes una alternativa superior en casi todos los aspectos. Incluso aventuraré a adivinar que has hecho otra cosa que es "mala" para manipularte y querer hacer esto.
Recuerde siempre: otras personas, que no lo consultarán, tarde o temprano deberán mantener este código. Piensa en ellos, no solo en ti mismo, quién puede resolverlo. Además, dentro de una década a partir de ahora, ¿quién puede decir que recordará su propio truco? Usted podría ser ese mantenedor confundido ...