Проводит ли эта ссылка через функцию?
Является ли следующая функция безопасной в С++ 03 или С++ 11 или она отображает UB?
string const &min(string const &a, string const &b) {
return a < b ? a : b;
}
int main() {
cout << min("A", "B");
}
-
Можно ли вернуть ссылку на объект, переданный функции, на
Справка?
-
Гарантируется ли временный объект string
не слишком быстро уничтожен?
-
Есть ли вероятность, что данная функция
min
может отображать UB (если это не в данном контексте)?
-
Можно ли сделать эквивалентную, но безопасную функцию, все еще избегая
копирование или перемещение?
Ответы
Ответ 1
Можно ли вернуть ссылку на объект, переданный функции по ссылке?
Пока объект не будет уничтожен до того, как вы получите доступ к нему через эту ссылку, да.
Гарантировано ли, что временный объект string
не будет уничтожен слишком скоро?
В этом случае да. Временное продолжается до конца полного выражения, которое его создает, поэтому оно не уничтожается до тех пор, пока поток не будет передан в cout
.
Есть ли вероятность, что данная функция min может отображать UB (если она не в данном контексте)?
Да, вот пример:
auto const & r = min("A", "B"); // r is a reference to one of the temporaries
cout << r; // Whoops! Both temporaries have been destroyed
Можно ли сделать эквивалентную, но безопасную функцию, избегая при этом копирования или перемещения?
Я так не думаю; но эта функция безопасна до тех пор, пока вы не сохраните ссылку на ее результат.
Ответ 2
Ваши временные объекты останутся "живыми" до конца ;
из cout
в основном, поэтому этот способ его использования безопасен.
Ответ 3
Да, это безопасно. Темп последовательности для "А" и "В" сохранится до конца "точки последовательности", то есть точки с запятой.
Ответ 4
Гарантируется, что объект временной строки также не будет уничтожен скоро
Для вашего конкретного случая да, НО для следующего кода no
int main() {
const string &tempString(min("A", "B"));
cout << tempString;
}
Кроме того, я согласен с тем, что сказал Майк Сеймур.
Ответ 5
да безопасно передавать ссылку через функцию, потому что в изменениях, всегда внесенных в аргументы, которые вы передаете по значению, и в приведенной выше строке кода темп для А и В будет выживать до конца "точки последовательности", является точкой с запятой, но в случае передачи по ссылке изменений, сделанных в копии этого аргумента, не в оригинальной копии.