Насколько я знаю, два общих способа эффективного реализации конструктора в С++ 11 используют два из них
Foo(const Bar& bar) : bar_{bar} {};
Foo(Bar&& bar) : bar_{std::move(bar)} {};
или только один в порядке
Foo(Bar bar) : bar_{std::move(bar)} {};
с первым параметром, обеспечивающим оптимальную производительность (например, надеюсь, что единственная копия в случае lvalue и одно перемещение в случае rvalue), но для перегрузки N требуется 2 N тогда как второй вариант нуждается только в одной функции за счет дополнительного перемещения при передаче в lvalue.
В большинстве случаев это не должно сильно влиять на результат, но, безусловно, ни один из них не является оптимальным. Однако можно также сделать следующее:
template<typename T>
Foo(T&& bar) : bar_{std::forward<T>(bar)} {};
Это имеет недостаток, позволяющий допускать переменные возможных нежелательных типов как параметр bar
(который является проблемой, я уверен, легко разрешается с помощью специализированной специализации), но в любом случае производительность является оптимальной, а код растет линейно с количество переменных.
Почему никто не использует что-то вроде передового для этой цели? Разве это не самый оптимальный способ?