int& foo() {
printf("Foo\n");
static int a;
return a;
}
int bar() {
printf("Bar\n");
return 1;
}
void main() {
foo() = bar();
}
No estoy seguro de cuál se debe evaluar primero.C++ orden de evaluación de función en el operador de asignación
He intentado en VC que la función de barra se ejecute primero. Sin embargo, en compilador por g ++ (FreeBSD), da la función foo evaluada primero.
pregunta interesante Mucho se deriva del problema anterior, supongamos que tengo una matriz dinámica (std :: vector)
std::vector<int> vec;
int foobar() {
vec.resize(vec.size() + 1);
return vec.size();
}
void main() {
vec.resize(2);
vec[0] = foobar();
}
Basado en el resultado anterior, el vc evalúa la foobar() y luego realizar el vector operador[]. No es problema en tal caso. Sin embargo, para gcc, ya que el vec [0] se está evaluando y la función foobar() puede llevar a cambiar el puntero interno de la matriz. El vec [0] puede invalidarse después de la ejecución de foobar().
¿Es decir que tenemos que separar el código de tal manera que
void main() {
vec.resize(2);
int a = foobar();
vec[0] = a;
}
+2, esa es una pregunta interesante; es algo que nunca he considerado antes. Obviamente estás en problemas si empiezas a usar código así de todos modos :) –
+1. Es realmente una pregunta interesante; más que eso, la pregunta se hace muy bien. Una pregunta bien escrita. – Nawaz
Me encontré con un ejemplo interesante de esto hoy: 'auto_ptr p (new int); smart_map m; m [1] = p.release(); 'Si supone que' smart_map :: operator [] 'podría arrojar, podría tener un caso donde' auto_ptr' libera su propiedad pero el mapa nunca asume la propiedad, en el caso donde se evalúa el RHS antes del LHS. (Supongamos que 'smart_map' es como un 'mapa' de STL, excepto que elimina el valor del puntero de cada par clave/valor en la destrucción.) –
mrkj