Jestem wykonawczych statycznych reguł analizy jakiegoś C++, a jeden z nich zakazuje funkcję powrotu referencję lub wskaźnik do parametru odniesienia funkcji, tj następujące są niezgodne:Czy ta reguła analizy statycznej C++ ma sens?
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
Podane uzasadnienie jest następujące: "Jest to zachowanie zdefiniowane w ramach implementacji, czy parametr referencyjny jest obiektem tymczasowym, czy odniesieniem do parametru."
Jestem zdziwiony tym, ponieważ operatory strumieniowe w C++ są napisane w ten sposób, np.
std::ostream& operator<<(std::ostream& os, const X& x) {
//...
return os;
}
Sądzę, że jestem przekonany, że operatory strumieniowe w C++ nie wykazują na ogół zachowania zgodnego z implementacją, więc co się dzieje?
Według mojego rozeznania, jak to jest obecnie, spodziewam nr 1 i nr 3 do być dobrze określony, na podstawie tego, że tymczasowych nie może być zobowiązany do odniesienia const, więc int& x
odnosi się do rzeczywistych obiektów, które ma żywotność wykraczającą poza zakres funkcji, dlatego zwrot wskaźnika lub odniesienie do tego obiektu jest w porządku. Spodziewałbym się, że # 2 będzie podejrzany, ponieważ tymczasowy może być związany z const int& x
, w którym to przypadku próba jego adresu wydaje się złym planem. Nie jestem pewien 4 # - moje przeczucie jest takie, że jest to potencjalnie podejrzane, ale nie jestem pewien. W szczególności, nie jestem jasne, na co by się stało w następującym przypadku:
const int& m(const int& x) { return x; }
//...
const int& r = m(23);
Używasz MSVC++? – Nawaz
@Nawaz: Używam .QL do pisania zapytań na dużych bazach kodu :) Nie sądzę, że powinno to mieć znaczenie, który kompilator, szukam idealnej odpowiedzi niezależnej od platformy. –
Dlaczego zadałem pytanie, ponieważ MSVC++ udostępnia rozszerzenie kompilatora, które pozwala tymczasowym powiązać się z referencjami bez stałych. Jeśli używasz narzędzia do analizy statycznej firmy Microsoft, może ono również uwzględnić to rozszerzenie. – Nawaz