Подтвердить что ты не робот

Return по значению, присвоенному константной ссылке

Я исправлял еще одну ошибку в каком-то коде и натолкнулся на какой-то код, который, как я думал, был ошибкой; однако этот код компилируется под gcc 4.4, 4.5 и 4.6 и, по-видимому, функционирует как "ожидаемый". Может ли кто-нибудь сказать мне, действительно ли это С++?

struct foo {
     int bar;
};

foo myfunction(foo const &orig) {
    foo fooOnStack = orig;
    fooOnStack.bar *= 100;
    return fooOnStack;
}

void myOtherFunction(foo const &orig) {
    foo const &retFoo = myfunction();
    // perhaps do some tests on retFoo.bar ...
}

Если это действительно С++, знает ли кто-нибудь обоснование того, что это является законным?

4b9b3361

Ответ 1

Да, это законный С++. Формирование ссылки на константу во временное время продлевает время жизни временного ресурса ссылки.

Ответ 2

Думаю, тебе все равно нужно быть осторожным. У меня есть случай, когда g++ - 4.9 с С++ 11 и сложные типы Eigen не уважают это (он удаляет данные в возвращаемом временном, даже если его срок жизни должен быть расширен). Следовательно, хотя это может быть законно, оно должно быть помечено как изворотливое, если для этого нет веской причины.

Также, учитывая, что С++ 11 ДОЛЖЕН выделять временное место на сайте вызова, если оно возвращается по значению, его полезность, возможно, меньше, чем раньше, если вы используете последний стандарт.