ОБНОВЛЕНИЕ: чтобы быть еще более явным и избежать недоразумений: я спрашиваю, в случае возврата именованного значения выполняет ли стандартная гарантия 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 обязательным, но это не мой вопрос.