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
sb
dentro 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 configurarbadbit
en el flujo cuandosb
es 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()
:goodbit
sisb
no 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_ostream
excepto que no invocarán a ningún miembro virtual derdbuf()
exceptooverflow()
,xsputn()
ysync()
.excepto que nunca llega tan lejos, porque para
basic_ostream::sentry
construction:[C++11: 27.7.3.4/3]:
Si, después de completar cualquier preparación,os.good()
estrue
,ok_ == true
contrario,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
badbit
ya 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?