Esta regra de análise estática de C ++ faz sentido como está?

Estou implementando algumas regras de análise estática de C ++ e uma delas proíbe que uma função retorne uma referência ou um ponteiro a um parâmetro de referência da função, ou seja, os seguintes itens não são compatíveis:

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

A justificativa dada para isso é que "é um comportamento definido pela implementação se o parâmetro de referência é um objeto temporário ou uma referência ao parâmetro".

Estou intrigado com isto, no entanto, porque os operadores de fluxo em C ++ são escritos desta maneira, e.

std::ostream& operator<<(std::ostream& os, const X& x) {
    //...
    return os;
}

Eu acho que estou bastante confiante de que operadores de fluxo em C ++ não exibem em geral comportamento definido pela implementação, então o que está acontecendo?

De acordo com o meu entendimento como é no momento, eu esperaria que os números 1 e 3 fossem bem definidos, na base de que os temporários não podem ser ligados a referências não-const, entãoint& x refere-se a um objeto real que tem vida além do escopo da função, portanto, retornar um ponteiro ou referência a esse objeto é bom. Eu esperaria que o # 2 fosse duvidoso, porque um temporário poderia ter sido obrigado aconst int& xNesse caso, tentar tomar seu endereço pareceria um plano ruim. Eu não tenho certeza sobre o # 4 - meu pressentimento é que isso também é potencialmente desonesto, mas não tenho certeza. Em particular, não estou claro sobre o que aconteceria no seguinte caso:

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

questionAnswers(2)

yourAnswerToTheQuestion