Я предложил бы сохранить понятия простыми и простыми. Внедрение зависимости является большим количеством архитектурного шаблона для слабой связи компонентов программного обеспечения. Шаблон "фабрика" является всего одним способом разделить ответственность создания объектов других классов к другому объекту. Шаблон "фабрика" можно назвать как инструмент для реализации DI. Внедрение зависимости может быть реализовано во многих отношениях как DI с помощью конструкторов, с помощью отображающий XML-файлы и т.д.
Правило следующее
Как вы говорите, временное значение - это rvalue, и поэтому конструктор перемещения выбран из-за правила в 13.3.3.2/3
, которое гласит, что ссылка rvalue привязывается к rvalue лучше, чем ссылка lvalue. Поэтому при принятии решения о том, следует ли использовать конструктор перемещения или конструктора копирования, разрешение перегрузки будет отдавать предпочтение конструктору перемещения.
Правило, разрешающее компилятору выполнять RVO, записано в 12.8 / 15
.
Все возвращаемые значения считаются rvalues
, поэтому, если компилятор не реализует RVO в этом случае, он должен использовать конструктор перемещения, а не конструктор копирования.