Имеет ли смысл это правило статического анализа C++?

Я реализую некоторые правила статического анализа C++, и одно из них запрещает функции возвращать ссылку или указатель на ссылочный параметр функции, т.е. все следующие несовместимы с -:

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

Обоснование этого заключается в том, что «реализацией -определяется поведение, независимо от того, является ли параметр ссылки временным объектом или ссылкой на параметр».

Однако я озадачен этим, потому что операторы потока в С++ написаны таким образом, например.

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

Я думаю, что вполне уверен, что потоковые операторы в C++ в целом не демонстрируют поведения, определяемого реализацией -, так что же происходит?

Согласно моему пониманию, как оно есть в настоящее время, я ожидаю, что #1 и #3 будут хорошо -определены на том основании, что временные объекты не могут быть привязаны к не -неконстантным ссылкам, поэтому int& xотносится к реальному объекту, время жизни которого выходит за рамки функции, поэтому возврат указателя или ссылки на этот объект — это нормально. Я ожидаю, что #2 будет хитрым, потому что временный объект мог быть привязан к const int& x, и в этом случае попытка получить его адрес показалась бы плохим планом. Я не уверен насчет #4 -я нутром чувствую, что это тоже потенциально сомнительно, но я не уверен. В частности, мне не ясно, что произойдет в следующем случае:

const int& m(const int& x) { return x; }
//...
const int& r = m(23);
12
задан curiousguy 21 July 2012 в 18:15
поделиться