Возврат rvalue ссылки или временного объекта в C ++ 11 - PullRequest
0 голосов
/ 26 января 2019

In Effective Modern C ++ элемент 12 , есть пример кода для справочных квалификаторов функций C ++ 11 :

class Widget {
public:
    using DataType = std::vector<double>;
    ...
    DataType &data() &            // for lvalue Widgets
    { return values; }            // return lvalue

    DataType data() &&            // return rvalue Widgets
    { return std::move(values); } // return rvalue
    ...
private:
    DataType values;
};

Так почему вторая data() функция перегрузки ссылки rvalue возвращает временный объект DataType, но не ссылка rvalue DataType&&?

1 Ответ

0 голосов
/ 26 января 2019

Единственная причина, которую я вижу, состоит в том, чтобы избежать создания висячей ссылки, когда объект является результатом предварительного значения:

Widget foo();

auto&& x = foo().data();

Если foo().data() вернул rvalue-ссылку на variable член, x будет висячей ссылкой, потому что результирующий объект foo() уничтожается в конце инициализации x (конец полное выражение).

С другой стороны, когда data()&& возвращается по значению, x связан с временной материализацией, которая будет иметь то же время жизни, что и x. Таким образом, висячие ссылки избегают.

Этот тип возврата для data() && не является идиоматическим в C ++. Обычно функции доступа возвращают ссылку, и такой сценарий использования, как приведенный выше, вероятно, вызывает «тревогу свисающей ссылки» любого рецензента кода.

Это определение data()&& разумно, но оно нарушает общее соглашение.

...