Sto implementando regole di analisi statica qualche C++, e uno di essi vieta una funzione che restituisce un riferimento o puntatore a un parametro di riferimento della funzione, vale a dire i seguenti sono tutti non conforme:Questa regola di analisi statica C++ ha senso così com'è?
int *f(int& x) { return &x; } // #1
const int *g(const int& x) { return &x; } // #2
int& h(int& x) { return x; } // #3
const int& m(const int& x) { return x; } // #4
L' la giustificazione fornita per questo è che "È un comportamento definito dall'implementazione se il parametro di riferimento è un oggetto temporaneo o un riferimento al parametro."
Sono perplesso, tuttavia, poiché gli operatori di flusso in C++ sono scritti in questo modo, ad es.
std::ostream& operator<<(std::ostream& os, const X& x) {
//...
return os;
}
penso di essere abbastanza sicuro che gli operatori del flusso in C++ non lo fanno in mostra comportamento generale definito dall'implementazione, così che cosa sta succedendo?
Secondo la mia comprensione attuale, mi aspetto che i n. 1 e n. 3 siano ben definiti, in base al fatto che i temporari non possono essere associati a riferimenti non costanti, quindi int& x
fa riferimento a un oggetto reale che ha una durata che va oltre lo scopo della funzione, quindi restituire un puntatore o un riferimento a quell'oggetto va bene. Mi aspetterei che il n. 2 sia ingannevole, perché un temporaneo avrebbe potuto essere legato a const int& x
, nel qual caso cercare di prendere il suo indirizzo sembrerebbe un pessimo piano. Non sono sicuro del # 4 - il mio istinto è anche potenzialmente dannoso, ma non ne sono sicuro. In particolare, non sono chiare su ciò che sarebbe accaduto nel caso seguente:
const int& m(const int& x) { return x; }
//...
const int& r = m(23);
Stai utilizzando MSVC++? – Nawaz
@Nawaz: Sto usando .QL per scrivere query su basi di codice di grandi dimensioni :) Non penso che dovrebbe importare quale compilatore, sto idealmente cercando una risposta indipendente dalla piattaforma. –
Perché l'ho chiesto perché MSVC++ fornisce l'estensione del compilatore che consente ai vincoli di associare a riferimenti non const. E se stai usando lo strumento di analisi statica di Microsoft, allora potrebbe prendere in considerazione anche questa estensione. – Nawaz