Использовать std :: move для именованного возвращаемого значения, чтобы гарантировать отсутствие копирования? - PullRequest
0 голосов
/ 04 апреля 2020

ОБНОВЛЕНИЕ: чтобы быть еще более явным и избежать недоразумений: я спрашиваю, в случае возврата именованного значения выполняет ли стандартная гарантия C ++ 17, что конструктор перемещения будет вызван, если я выполню std :: перейти на возвращаемое значение? Я понимаю, что если не использовать std :: move, компиляторам разрешено, но не обязательно, полностью исключать копирование и перемещение конструкторов и просто создавать возвращаемое значение непосредственно в вызывающей функции. Это не то, что я хочу сделать в моем примере, я хочу гарантии.

Рассмотрим

class A; // Class with heap-allocated memory and 'sane' move constructor/move assignment.

A a_factory(/* some args to construct an A object */) 
{
  // Code to process args to be able to build an A object.
  A a(// args); // A named instance of A, so would require non-guaranteed NRVO.
  return std::move(a);
}

void foo()
{
  A result = a_factory();
}

В этом сценарии стандарт C ++ гарантирует, что при создании result объект, т.е. есть ли у нас гарантированная конструкция перемещения?

Я понимаю недостатки явного std :: move для возвращаемого значения, например, в случаях, когда класс A является неподвижным, мы не можем выполнить позднюю материализацию временных значений и получить 0 копий даже без конструктора перемещения в классе , Но мой конкретный вопрос c заключается в том, что я пришел из жесткого фона в реальном времени, и текущий статус NRVO, не гарантируемый стандартом, далеко не идеален. Я знаю 2 конкретных c случая, когда C ++ 17 делал (неименованным) RVO обязательным, но это не мой вопрос.

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