Здравствуйте, serg_joker, Вы писали:
_>и ещё прикольнее, если тип конструируемой сущности и аргументов конструктора — параметр шаблона типа
_>_>template<typename T, typename... ARG>
_>auto construct(const T&, ARG&&... arg)
_>{
_> T ret( std::forward<ARG>(arg)...); // (1)
_> T ret{ std::forward<ARG>(arg)...}; // (2)
_> // do some processing, registration of `ret` etc
_> return ret;
_>}
_>
_>Какой вариант правильнее, (1) или (2)? Вроде как (2) кошернее, если там хочешь сужающих преобразований типов избежать, к примеру, ну и вообще, "Uniform" жеж. Но если T — вектор, к примеру, тады ой.
_>Когда vector виден в коде явно — ещё можно на опыте среагировать на то, что {} может делать не то, что от него ожидал автор. А вот в шаблоне — уже нужно напрячься.
Ну да, это общая проблема использования инит-листов в конструкторах. Я с ней, бывало, сталкивался даже при проектировании собственных классов. С одной стороны, сделали универсальную инициализацию с фигурными скобочками, с другой подсунули эти инит-листы. Мне инит-листы с самого начала не нравились.