Es posible crear (y pasar) un puntero a un objeto temporal, asumiendo que usted sabe lo que está haciendo. Sin embargo, debe hacerse de manera diferente.
Una función con valor de retorno de tipo no de referencia devuelve rvalue. En C++, se prohíbe aplicar el operador unario incorporado &
a un valor r. Requiere un lvalue
Esto significa, que si se quiere obtener un puntero a su objeto temporal, hay que hacerlo de alguna otra manera. Por ejemplo, como una secuencia de dos líneas
const string &r = f1(str);
f2(&r);
que también se puede plegar en una sola línea mediante el uso de un molde
f2(&(const string &) f1(str));
En ambos casos anteriores la función f2
debe aceptar un parámetro const string *
. Solo un string *
como en su caso no funcionará, a menos que elimine la constness del argumento (lo que, por cierto, hará que todo sea aún más feo de lo que ya es). Aunque, si me sirve la memoria, en ambos casos no hay garantía de que la referencia se adjunte al original temporal y no a una copia.
Hemos de tener en cuenta, sin embargo la creación de punteros a objetos temporales es una práctica bastante dudosa ya que si los problemas de toda la vida obvias. Normalmente deberías evitar la necesidad de hacer eso.
Pero puedo usar f1() de esta manera: f1 (str) = "feliz"; Aquí estoy usando temporal como l-value. –
Happy Mittal, la palabra lvalue puede ser un poco confusa, ya no significa "un valor que puede pararse en el lado izquierdo de una tarea". cuando utiliza el operador '=', de hecho está llamando a una función miembro del objeto de cadena. Puede usar miembros de valores. – avakar
Entonces, ¿qué pasaría si string tuviera un operador explícito y {return this;}? – user168715