¿Por qué muchas implementaciones estándar permiten que se asigne un valor directamente a un ostream_iterator?

Todas las implementaciones estándar que he probado permiten asignar valores al std::ostream_iteratores sin haberlos desreferenciado antes de la asignación. Aunque los algoritmos estándar eliminan la referencia de los iteradores antes de la asignación, me gustaría saber por qué hay implementaciones que no solo prohíben la asignación estáticamente (con la ayuda de una clase de proxy) para que la compilación simplemente falle, de modo que el usuario sabe que podría suceder algo incorrecto si dicha asignación se traslada a otra implementación que no permita la asignación por alguna razón. En general, al implementar una funcionalidad estándar, ¿es una buena práctica limitar la implementación para permitir solo lo que se menciona explícitamente en el estándar?

#include <iterator>
#include <string>
#include <iostream>

using namespace std;

int main() {
    ostream_iterator<string> o(cout);
    o = "Hello World\n"; // o is not dereferenced! It compiles with my GCC environment
    o++; // to make sure the implementation writes to cout
}

preguntado el 09 de marzo de 12 a las 23:03

In general, when implementing a standard functionality, is it a good practice to limit the implementation to only allow what is explicitly mentioned by the standard? Sí, por supuesto. -

2 Respuestas

La sobrecarga del operador que permite esta asignación está especificada por el estándar del lenguaje C ++. Por lo tanto, una implementación de biblioteca estándar de C ++ debe proporcionarlo.

La sobrecarga se especifica de la siguiente manera (de C ++ 11 §24.6.2.2 / 1):

ostream_iterator& operator=(const T& value);

Efectos:

*out_stream << value;
if(delim != 0)
    *out_stream << delim;

return (*this);

(T es la T con el cual el ostream_iterator fue instanciado. En tu ejemplo, es string.)

Respondido el 20 de junio de 20 a las 10:06

Los iteradores de flujo son realmente iteradores falsos. La inserción ocurre al asignar para ostream_iterator y la extracción ocurre cuando se elimina la referencia para istream_iterator. La operator*() para ostream_iterator en realidad se especifica como una operación no operativa para simplemente regresar *this.

respondido 09 mar '12, 23:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.