int& foo() {
printf("Foo\n");
static int a;
return a;
}
int bar() {
printf("Bar\n");
return 1;
}
void main() {
foo() = bar();
}
Non sono sicuro quale debba essere valutato per primo.Ordine di valutazione funzione C++ nell'operatore di assegnazione
Ho provato in VC che la funzione di barra viene eseguita per prima. Tuttavia, nel compilatore di g ++ (FreeBSD), emette prima la funzione foo valutata.
Molto domanda interessante deriva dal problema di cui sopra, supponiamo di avere una matrice dinamica (std :: vector)
std::vector<int> vec;
int foobar() {
vec.resize(vec.size() + 1);
return vec.size();
}
void main() {
vec.resize(2);
vec[0] = foobar();
}
Sulla base del risultato precedente, il VC valuta l'pippo() e quindi eseguire il vettore operatore[]. Non è un problema in questo caso. Tuttavia, per gcc, poiché il vec [0] è in fase di valutazione e la funzione foobar() può portare a modificare il puntatore interno dell'array. Il vec [0] può essere invalidato dopo l'esecuzione di foobar().
E 'significa che abbiamo bisogno di separare il codice in modo che
void main() {
vec.resize(2);
int a = foobar();
vec[0] = a;
}
+2, questa è una domanda interessante; è qualcosa che non ho mai considerato prima. Ovviamente sei nei guai se inizi ad usare un codice del genere comunque :) –
+1. È davvero una domanda interessante; più che la domanda è posta molto bene. Una domanda ben scritta. – Nawaz
Mi sono imbattuto in un interessante esempio di questo oggi: 'auto_ptr p (nuovo int); smart_map m; m [1] = p.release(); 'Se si suppone che' smart_map :: operator [] 'possa lanciare, si potrebbe avere un caso in cui' auto_ptr' ne rilascia la proprietà ma la mappa non assume mai la proprietà, nel caso in cui l'RHS viene valutato prima del LHS. (Supponiamo che 'smart_map' sia come una' map' STL, tranne che cancella il valore del puntatore di ogni coppia chiave/valore alla distruzione.) –
mrkj