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

Проводит ли эта ссылка через функцию?

Является ли следующая функция безопасной в С++ 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 (если это не в данном контексте)?

  • Можно ли сделать эквивалентную, но безопасную функцию, все еще избегая копирование или перемещение?

4b9b3361

Ответ 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

да безопасно передавать ссылку через функцию, потому что в изменениях, всегда внесенных в аргументы, которые вы передаете по значению, и в приведенной выше строке кода темп для А и В будет выживать до конца "точки последовательности", является точкой с запятой, но в случае передачи по ссылке изменений, сделанных в копии этого аргумента, не в оригинальной копии.