Сохранение возвращаемого значения в качестве константной ссылки по сравнению со значением

Предположим, что функция имеет подпись

std::string GetString();

и что он возвращает новую строку по значению. Теперь приведен следующий код:

// (a) Store the return value to a const reference.
const std::string& my_string = GetString();

// (b) Store the return value to a (const) value.
const std::string my_string = GetString();

Правильно ли я понимаю, что (a) и (b), с точки зрения компилятора C ++ 11, идентичны? Если да, то есть ли грубый консенсус по выбору стиля?

0

Решение

Правильно ли я понимаю, что (a) и (b), с точки зрения компилятора C ++ 11, идентичны?

Нет, они не идентичны.

(а) продлевает срок службы временного объекта, возвращенного GetString(),

(б) делает новый объект. Он построен путем:

  1. вызывая конструктор копирования std::string используя возвращаемое значение GetString() в качестве аргумента,
  2. присваивается возвращаемое значение GetString() по RTO или
  3. вызывая конструктор перемещения, используя возвращаемое значение GetString(),
1

Другие решения

Теоретически они разные, но практически они идентичны. Единственный код, который вы можете написать, чтобы показать разницу, будет включать decltype(my_string),

Компилятор может сгенерировать одну и ту же сборку для обоих.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector