c++ - studio - ¿Por qué devolver la dirección de la variable local o temporal solo es una advertencia y no un error?
solidity español (2)
Habiendo recibido una advertencia del compilador para esta función:
template<class T>
Matrix3x3<T> & operator - (Matrix3x3<T> const & p)
{
auto m = Matrix3x3<T>(p);
m.m11 = -m.m11; m.m12 = -m.m12; m.m13 = -m.m13;
m.m21 = -m.m21; m.m22 = -m.m22; m.m23 = -m.m23;
m.m31 = -m.m31; m.m32 = -m.m32; m.m33 = -m.m33;
return m;
}
, Me pregunto por qué devolver una dirección de variable local o temporal no merece un error. ¿Hay circunstancias en las que hay que hacerlo? ¿Cuál es la razón para que este solo sea un "comportamiento indefinido" y no una restricción de idioma?
No puedo pensar en ninguna.
Motivo: falta de coherencia en la generación de error del compilador .
En su caso directo , el compilador es realmente útil para generar una advertencia. Trátalo solo como una bonificación .
Pero busque el siguiente caso donde el compilador no reconoce este problema:
int& foo ()
{
int i = 1;
static int j;
return i? i : j; // No warning in g++-5!
}
Ahora, desde la perspectiva del compilador, no está justificado si da error para un caso y en otro caso se resuelve debido a la complejidad del código.
Uno de los casos de uso de dicha limitación del compilador puede ser la "generación de números aleatorios", como lo sugiere muy bien @tsuki.
No hay una buena razón para que no sea un error, solo el estándar C ++ no trata este caso como tal y los compiladores que cumplen con el estándar se adhieren al estándar.
Sin embargo, se recomienda emitir una advertencia:
§12.2.5.2 La vida útil de un límite temporal al valor devuelto en una declaración de retorno de función (6.6.3) no se extiende; el temporal se destruye al final de la expresión completa en la declaración de retorno .
[...]
[Nota: Esto puede introducir una referencia pendiente, y se recomienda que las implementaciones emitan una advertencia en tal caso . - nota final]
El énfasis es mío.