Возврат по значению, присвоенному константной ссылке
Я исправил еще одну ошибку в каком-то коде и наткнулся на код, который, как я думал, был ошибкой; однако этот код компилируется в 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 ...
}
Если это действительно C++, знает ли кто-нибудь обоснование этого законности?
2 ответа
Да, это законно C++. Формирование ссылки на const для временного объекта продлевает время существования временного объекта до времени жизни ссылки.
Я думаю, что вы все равно должны быть осторожны. У меня есть случай, когда g++-4.9 с C++11 и сложными типами Eigen не учитывает это (он удаляет данные в возвращенном временном файле, даже если предполагается, что его время жизни будет увеличено). Следовательно, даже если это может быть законно, его следует пометить как хитрое, если для этого нет действительно веской причины.
Кроме того, учитывая, что C++11 ДОЛЖЕН размещать временный объект на сайте вызова, если он возвращается по значению, его полезность, возможно, меньше, чем раньше, если вы используете последний стандарт.