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