Нет, если конструктор копирования доступен.
До C ++ 17 и гарантированного разрешения копирования, либо конструктор перемещения ИЛИ конструктор копированиядолжен был быть доступен для кода, чтобы быть законным.Elision была просто оптимизацией и не влияла на то, будет ли код компилироваться или нет.
То есть, существует двухэтапный процесс:
- Оценить, является лиутверждение
return <expr>;
является допустимым, которое до C ++ 17 требует (за исключением преобразований), что должен присутствовать либо конструктор копирования, либо, при наличии временного, конструктор перемещения и доступный . - Если возможно, примените Оптимизацию возвращаемого значения и исключите вызов для указанного конструктора.
Учитывая это, давайте рассмотрим кавычки:
Копирует elision и RVO все еще будет работать для классов без конструкторов перемещения?
Да, RVO все еще включается. Фактически, компилятор должен выбрать: RVO (если возможно)
Да следует понимать в контексте законного кода .Если код не компилируется, то вопрос спорный.
В соответствии с правилами негарантированного копирования, это создаст временное значение, а затем переместится из этого временного значения в возвращаемое значение функции.Эта операция перемещения может быть исключена, но у T по-прежнему должен быть доступный конструктор перемещения, даже если он никогда не используется.
Это кратчайший путь;Попытка сформулировать предложение с учетом возможного отсутствия конструктора перемещения и, следовательно, отступления к конструктору копирования, просто испортила бы объяснение, и ФП не дал никаких указаний на то, что рассматривалась такая ситуация.