2009-08-27 10 views
20
temporal

que tiene una función como estaadvertencia: regresar referencia a

const string &SomeClass::Foo(int Value) 
{ 
    if (Value < 0 or Value > 10) 
     return ""; 
    else 
     return SomeClass::StaticMember[i]; 
} 

consigo warning: returning reference to temporary. ¿Porqué es eso? Pensé que los dos valores que devuelve la función (referencia a const char * "" y referencia a un miembro estático) no pueden ser temporales.

Respuesta

43

Este es un ejemplo cuando se lleva a cabo una conversión implícita no deseada. "" no es std::string, por lo que el compilador intenta encontrar la manera de convertirlo en uno. Y al usar el constructor string(const char* str), tiene éxito en ese intento. Ahora se ha creado una instancia temporal de std::string que se eliminará al final de la llamada al método. Por lo tanto, obviamente no es una buena idea hacer referencia a una instancia que ya no existirá después de la llamada al método.

Sugiero que cambie el tipo de devolución a const string o almacene el "" en un miembro o una variable estática de SomeClass.

+13

Una buena respuesta! He aquí por qué creo que C++ no es una buena opción para los desafíos actuales de programación. Te consumirá tiempo cuidando sus trabajos internos cuando prefieras concentrarte en el problema de las manos. –

+13

@Luis: todos los idiomas que desea mencionar tienen estos inconvenientes en casos de esquinas. –

+1

¡Parecería que la conversión * es * deseada aquí! : P Una vez que cambias a regresar por valor, la const debe ser eliminada también. –

5

El problema está en la primera línea. "" se convertirá en std::string, ya que tiene un constructor válido que toma un char*. Ese std::string será un objeto anónimo, que es temporal, y usted devuelve su referencia.

4

Como Shaggy Frog dijo, convierte "" en un objeto std :: string temporal y como la firma de su método es std :: string & intenta devolver una referencia a él, por lo tanto, recibe la advertencia. Una solución alternativa puede ser devolver std :: string por valor (const std :: string SomeClass :: Foo (..)).

6

Este es el ejemplo de tratar de optimizar el código en C++. Lo hice, todos lo hicieron ... Vale la pena mencionar que este es el ejemplo clásico que es elegible para la optimización del valor devuelto.

Como ttvd dijo que la respuesta correcta es devolver const std :: string y no hacer una referencia y permitir que el compilador la optimice.

Si confía en el intérprete de su idioma favorito para optimizarlo, tampoco debe tratar de ser demasiado inteligente con C++.

0

La otra posibilidad de evitar es declarar lo que quiere de regreso si lo estático y sólo tiene que utilizar el retorno por referencia

Cuestiones relacionadas