Czy ta reguła analizy statycznej C ++ ma sens?

Implementuję niektóre reguły analizy statycznej C ++, a jedna z nich zabrania funkcji zwracania odwołania lub wskaźnika do parametru referencyjnego funkcji, tj. Wszystkie są niezgodne:

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

Uzasadnieniem jest to, że „Jest to zachowanie zdefiniowane przez implementację, czy parametr referencyjny jest obiektem tymczasowym, czy odniesieniem do parametru”.

Jestem jednak 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;
}

Myślę, że jestem całkiem pewien, że operatory strumieniowe w C ++ nie wykazują ogólnie zachowania zdefiniowanego przez implementację, więc co się dzieje?

Zgodnie z moim zrozumieniem, tak jak obecnie, spodziewałbym się, że # 1 i # 3 będą dobrze zdefiniowane, na podstawie tego, że tymczasowe nie mogą być związane z nietrwałymi odniesieniami, więcint& x odnosi się do rzeczywistego obiektu, który ma czas życia poza zakresem funkcji, dlatego zwrócenie wskaźnika lub odniesienia do tego obiektu jest w porządku. Spodziewałbym się, że # 2 będzie podejrzany, ponieważ mógł być związany tymczasowyconst int& x, w którym to przypadku próba przyjęcia jego adresu wydaje się złym planem. Nie jestem pewien co do nr 4 - moje przeczucie jest takie, że jest potencjalnie ryzykowne, ale nie jestem pewien. W szczególności nie jestem pewien, co by się stało w następującym przypadku:

const int& m(const int& x) { return x; }
//...
const int& r = m(23);

questionAnswers(2)

yourAnswerToTheQuestion