Информация об изменениях

Сообщение Re[4]: Как написать Any с uniform initialization от 29.11.2019 10:14

Изменено 29.11.2019 10:20 rg45

Re[4]: Как написать Any с uniform initialization
Здравствуйте, 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>делай везде префект порвардинг и не будет лишних копирований.

Настало время вредных советов? Бездумное применение perfect forwarding — это современный изощренный способ стрельбы по собственным конечностям, а тем более, если ВЕЗДЕ. И кстати, в твоем примере это никакой не perfect forwarding, а просто rvalue ссылка на объект initializer_list. Который, даже сам являясь времменным объектом, предосдавляет доступ к своим элементам исключительно по константным lvalue ссылкам — с неминуемым копированием, без вариантов.
Re[4]: Как написать Any с uniform initialization
Здравствуйте, 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>делай везде префект порвардинг и не будет лишних копирований.

Настало время вредных советов? Бездумное применение perfect forwarding — это современный изощренный способ стрельбы по собственным конечностям, а тем более, если ВЕЗДЕ.

И кстати, в твоем примере это никакой не perfect forwarding, а просто rvalue ссылка на объект initializer_list. Который, даже сам являясь времменным объектом, предосдавляет доступ к своим элементам исключительно по константным lvalue ссылкам — с неминуемым копированием.