me encontré con un error sutil hace un par de días en que el código se veía algo como esto:¿Qué uso hay para los 'fines' en estos días?
ostringstream ss;
int anInt(7);
ss << anInt << "HABITS";
ss << ends;
string theWholeLot = ss.str();
El problema era que el ends
sobresalía un '\ 0' en la ostringstream
por lo theWholeLot
realidad parecía "7HABITS\0"
(es decir, un valor nulo al final)
Ahora bien, esto no se había presentado porque theWholeLot
entonces estaba siendo utilizada para tomar la parte const char *
usando string::c_str()
eso quiere decir que el nulo fue enmascarado como se hizo sólo un delimitador. Sin embargo, cuando esto cambió a usar cadenas en todas partes, la nula intención de repente algo y comparaciones como:
if (theWholeLot == "7HABITS")
fracasarían. Esto me hizo pensar: Presumiblemente, el motivo de ends
es un retroceso a los días de ostrstream
cuando la secuencia normalmente no terminaba con un valor nulo y tenía que ser tal que str()
(que luego arrojaba no string
sino un char *
) funcionara correctamente .
Sin embargo, ahora que no es posible echar fuera un char *
de un ostringstream
, utilizando ends
no sólo es superfluo, pero potencialmente peligroso y estoy considerando la eliminación de todos ellos desde mi código clientes.
¿Alguien puede ver una razón obvia para usar ends
en un entorno único de std::string
?
Mi única objeción sería ¿qué es un entorno std :: string only? Cualquier programa no trivial va a char * argumentos de llamadas al sistema, etc. Dicho esto, hay media docena de otras maneras de lidiar con eso y los fines tienen una utilidad insignificante. – Duck
Aquí hay algunos usos de 'std :: ends': http://stackoverflow.com/questions/624260/how-to-reuse-an-ostringstream/624291#624291 –
No es solo para cadenas. Es útil para transmisiones generales. Algunas herramientas de Unix necesitan bytes nulos como terminadores. 'cout << ends;' se los proporcionará. –