Здравствуйте, rg45, Вы писали:
R>Здравствуйте, Kernan, Вы писали:
M>>>конструктор Any{int} и Any{Any &&} работает совершенно по-разному в моём коде. разве что шаблонный класс-хелпер-инициализатор со специализациями сделать вместо конструктора — и передавать из универсального шаблонного конструктора в него — но это сложно и поэтому убого выглядит
K>>Ну так перегрузи его
K>>K>> template<class T>
K>> Any(std::initializer_list<T>&&) { std::cout<<"foo"<<std::endl; }
K>>
K>>и в мейн
K>>K>> Any a{10};
K>>
K>>делай везде префект порвардинг и не будет лишних копирований.
R>Настало время вредных советов? Бездумное применение perfect forwarding — это современный изощренный способ стрельбы по собственным конечностям, а тем более, если ВЕЗДЕ.
Ну.. дай свой, лол.
R>И кстати, в твоем примере это никакой не perfect forwarding, а просто rvalue ссылка на объект initializer_list.
Согласен, да.
R>Который, даже сам являясь времменным объектом, предоставляет доступ к своим элементам исключительно по константным lvalue ссылкам. Поэтому перемешение содержимого initializer_list невозможно в принципе. Пруф здесь.
Ну ок.
Для архаичных компиляторов есть архаичное стандартное решение:
template <typename Tn>
Any( Tn &&, std::enable_if_t<!std::is_convertible_v<Tn, Any>, enabler> = enabler{} ) {printf("\ntemplate");}
Здравствуйте, night beast, Вы писали:
NB>может не сработать на старых реализациях, т.к. неиспользуемые шаблонные параметры с дефолтным значением в старых версиях стандарта в SFINAE не участвуют.