Здравствуйте, Skorodum, Вы писали:
R>>Если же изменить тип результата make_foo на std::optional<Foo>, все эти возможности тут же пропадут. S>Понял: мы же не может Foo в optional копировать. Спасибо.
Да, именно. Если резюмировать, то mandatory copy/move elision можно рассматривать как возможность расширения конструкторов. Сам конструктор содержит в себе только те действия, которые свойственны непосредственно классу объекта. А над этим мы можем еще построить массу разнообразных фабрик/загрузчиков/парсеров и т.п., в которых будут выполняться действия по созданию объекта, специфичные для мира, в котором этот объект создается. И в итоге всегда будем иметь под рукой простую и удобную процедуру создания объекта.
--
Не можешь достичь желаемого — пожелай достигнутого.