Когда временное продление жизни полезно в современном C ++? - PullRequest
0 голосов
/ 04 июня 2018

В C ++ вы можете привязать возвращаемое значение функции (которая возвращает значение, а не ссылку) к константной ссылке, и код все равно будет действителен, потому что время жизни этого временного объекта будет продлено до конца области действия.Например,

std::string get_string() {
    return "abc";
}


void f() {
    const std::string& str = get_string();
    std::cout << str; // valid, str is not dangling reference.
}

Мой вопрос: когда это полезно, например, когда код типа

A get_a();
const A& a = get_a();

лучше, чем код

A get_a();
A a = get_a();

и в чемспособ (например, быстрее, меньший размер файла и т. д.)?Какими должны быть реализации A, get_a и кода после вызова get_a?

Я проверял несколько случаев вручную, и в каждом случае, похоже, было одинаковое количество копий и ходов.

Давайте ограничим этот вопрос текущими стандартами C ++, современными версиями компиляторов и сборок с включенной оптимизацией (O2, O3 или эквиваленты для других компиляторов)

1 Ответ

0 голосов
/ 04 июня 2018

Умышленное продление времени жизни значений в именованных переменных стека, как это, бесполезно, если вы точно знаете, что происходит.Это означает, что это полезно, если вы не знаете , что именно происходит.

Скажем, вы находитесь в функции шаблона.И пользователь должен дать вам некоторый объект, который имеет get функцию-член, которая возвращает некоторый тип, который соответствует некоторому ожидаемому поведению.Вопрос: get возвращает ссылку или значение?

Ответ: вам все равно .Не имеет значения, возвращает ли оно значение или ссылку;важно то, что тем, что он возвращает, можно манипулировать так, как вы ожидаете.Например, вы можете ожидать, что obj.get() = 10; сработает.

Возможно get возвращает ссылку на объект.Или, может быть, он возвращает значение prvalue, которое является прокси-объектом, который действует как ссылка.В приведенном выше случае, возможно, он имеет перегрузку operator=, так что вы можете назначить его.Вам, пользователю, все равно.

Итак, что произойдет, если вы захотите сохранить то, что get возвращает в течение (короткого) периода времени?Ну, вы не хотите делать auto x = obj.get();;если он вернул реальную ссылку, вы получите копию ссылки, которая, вероятно, не та, которую вы хотели.Итак, вы делаете auto &&x = obj.get();.Lifetime extension позволяет работать так же хорошо с объектами proval prvalue, как и с реальными ссылками.

...