unarios sobrecarga que programacion operadores operador esta compuesta binarios c++ c++11 iostream rvalue-reference

c++ - que - ¿Por qué la sobrecarga de valor de `operator<<` para `basic_ostream` devuelve una referencia de valor l?



sobrecarga de operadores unarios en c++ (1)

Es un defecto y es mi culpa, lo siento. LWG 1203 (¡gracias por encontrarlo para mí! :-)) es mi opinión actual sobre la solución correcta para el "rvalue-stream-stream-insertter". Tenga en cuenta que todavía podría atraparlo y estar en problemas:

auto&& s = (std::stringstream() << "hi there!/n"); std::cout << s.rdbuf(); // oops

Aunque al menos en el código anterior es un poco más obvio (debido a la && ) que estás haciendo algo que no debes hacer.

§27.7.3.9 define la siguiente sobrecarga para el operator<< :

template <class charT, class traits, class T> basic_ostream<charT, traits>& operator<<(basic_ostream<charT, traits>&& os, const T& x);

Efectos: os << x
Devoluciones: os

( §27.7.2.6 define la sobrecarga de rvalor para el operator>> .)
Básicamente, simplemente reenvía a una sobrecarga de lvalor. Considero que esta sobrecarga es bastante peligrosa (la istream incluso más que la ostream , en realidad), considere lo siguiente:

#include <sstream> #include <iostream> int main(){ auto& s = (std::stringstream() << "hi there!/n"); std::cout << s.rdbuf(); // oops }

Ejemplo en vivo en Ideone (ejemplo perfecto de comportamiento indefinido. No imprime nada para mí en MSVC10).

El ejemplo anterior puede parecer artificial, pero no debería ser demasiado difícil entrar en esta situación en un código genérico o al pasar el (std::stringstream() << "text") a una función que proporciona un lvalue y un rvalue sobrecarga y almacena std::ostream o std::istream de diferentes maneras según la sobrecarga.

Ahora, ¿qué sería un argumento de nuevo devolviendo un basic_ostream<charT, traits>&& y especificando lo siguiente?

Devoluciones: mover (os)

(Y lo mismo para basic_istream .)

¿Hay algo que estoy pasando por alto? En el estado actual, en mis ojos, parece peligroso y como un defecto. Revisé la lista de problemas de LWG y encontré esta propuesta (¡Hola @HowardHinnant!). De hecho, devuelve un valor, sin embargo, solo por el beneficio adicional de poder encadenar a este operador especial, sin abordar específicamente el problema de seguridad que describí anteriormente (aunque ciertamente lo resuelve). Además, está marcado como cerrado y para reconsideración para el siguiente estándar. Como tal, pensé que lo pediría aquí:

¿Hay alguna buena razón por la que la sobrecarga mencionada anteriormente devuelva una referencia de valor l?