Передать аргумент функции как ссылку на r-значение против ссылки на const l-value - PullRequest
2 голосов
/ 30 марта 2020

Давайте рассмотрим следующие функции:

void processString1(const string & str) { /** **/}
void processString2(string && str) { /** **/}

processString1("Hello");
processString2("Hello");

Как я предполагаю, processString1 вызовет конструктор копирования, а processString2 - конструктор перемещения строки. Что эффективнее?

1 Ответ

3 голосов
/ 30 марта 2020

Ваше понимание здесь ошибочно.

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

Однако вызовы вашей функции передают строку C - и возникает неявное преобразование из C -строки в std :: string.

Таким образом, каждый из них создаст ВРЕМЕННУЮ std :: string нашу из C -строки "Hello".

Этот временный объект будет привязан к ссылке на const в первом случае и rval-reference-to-non-const во втором случае.

Язык гарантирует, что время жизни временной существует как минимум в течение времени жизни вызова функции.

Ни один из вызовов функций не имеет конструкции - единственная конструкция возникает, когда C -строка неявно преобразуется в экземпляр std :: string.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...