Предположим, что функция имеет подпись
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, идентичны? Если да, то есть ли грубый консенсус по выбору стиля?
Правильно ли я понимаю, что (a) и (b), с точки зрения компилятора C ++ 11, идентичны?
Нет, они не идентичны.
(а) продлевает срок службы временного объекта, возвращенного GetString()
,
(б) делает новый объект. Он построен путем:
std::string
используя возвращаемое значение GetString()
в качестве аргумента,GetString()
по RTO илиGetString()
,Теоретически они разные, но практически они идентичны. Единственный код, который вы можете написать, чтобы показать разницу, будет включать decltype(my_string)
,
Компилятор может сгенерировать одну и ту же сборку для обоих.