ejemplos - libreria iostream c++ descargar
¿Es válido construir un `std:: ostream` desde un búfer nulo? (1)
Sí, es legal y está bien definido crear una instancia de esa secuencia. Puede intercambiarlo de manera segura con otra secuencia, o asignarle un nuevo puntero (esta vez a un búfer existente) más adelante. La operación de salida en sí es de hecho un no-op.
Este es el por qué:
La construcción no tiene una condición previa que no sea nula y solo tiene esta condición posterior:
[C++11: 27.7.3.2/2]:Condición posterior:rdbuf() == sb.Curiosamente, señala explícitamente que no se realizará ninguna operación en
sbdentro del constructor:[C++11: 27.7.3.2/4]:Observaciones: No realiza ninguna operación enrdbuf().Pero tenga en cuenta también:
[C++11: 27.7.3.2/1]:Efectos: construye un objeto de la clasebasic_ostream, asignando valores iniciales a la clase base llamando abasic_ios<charT,traits>::init(sb)(27.5.5.2).Esa llamada
init(sb)tiene el efecto de configurarbadbiten el flujo cuandosbes NULL:[C++11: 27.5.5.2/3]:Condiciones posteriores: Las condiciones posteriores de esta función se indican en la Tabla 128.[C++11: Table 128]:[..]rdstate():goodbitsisbno es un puntero nulo, de lo contrariobadbit. [..]La operación de salida daría lugar a acciones equivalentes a la anulación de la referencia de un puntero nulo:
[C++11: 27.7.3.1/2]:Dos grupos de firmas de función miembro comparten propiedades comunes: las funciones de salida con formato (o insertadores) y las funciones de salida sin formato. Ambos grupos de funciones de salida generan (o insertan) caracteres de salida por acciones equivalentes a llamar ardbuf()->sputc(int_type). Pueden usar otros miembros públicos debasic_ostreamexcepto que no invocarán a ningún miembro virtual derdbuf()exceptooverflow(),xsputn()ysync().excepto que nunca llega tan lejos, porque para
basic_ostream::sentryconstruction:[C++11: 27.7.3.4/3]:Si, después de completar cualquier preparación,os.good()estrue,ok_ == truecontrario,ok_ == false.y, para
explicit operator basic_ostream::sentry::bool() const;:[C++11: 27.7.3.4/5]:Efectos: Devuelveok_.y:
[C++11: 27.7.3.7/1]:Cada función de salida sin formato comienza su ejecución al construir un objeto de clasesentry. Si este objeto devuelvetrue, mientras se convierte a un valor de tipobool, la función intenta generar la salida solicitada. [..]... la implicación es que no se realiza ninguna operación de salida cuando
badbitya está configurado.
Este fue también el caso en C ++ 03.
Considera lo siguiente:
std::ostream out(nullptr);
¿Es esto legal y bien definido?
¿Qué tal si ahora hago:
out << "hello world/n";
¿Es esto legal y bien definido? Si es así, ¿es de suponer que es un no-op?