При этом важно сохранить порядок следования элементов. До сих пор не знаю, как лучше это реализовать, каждый раз приходится прибегать к какому-нибудь извращению типа такого:
Ну в самом деле, когда мы очень похожим образом конструируем тот же initializer_list, у нас же нет необходимости самим писать эту запятую? Вот я этот момент не очень догоняю.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[4]: Вызов функтора для элементов переменного списка параметр
R>Ну в самом деле, когда мы очень похожим образом конструируем тот же initializer_list, у нас же нет необходимости самим писать эту запятую? Вот я этот момент не очень догоняю.
Не самый очевидный способ оставить в коде бомбу замедленного действия :)
Кто-нибудь передаст в качестве f функцию, у которой будет перегрузка по rvalue ref-qualifier (вроде метода mf3 тут), и программа поведёт себя неожиданным образом.
Конечно же в правильном коде никакой std::forward вокруг f не нужен. Да и вообще непонятно зачем тут к f применять forward было — на производительность он всё равно почти никогда не повлияет, а когда повлияет, то как раз за счёт нарушения корректности программы.
Re[3]: Вызов функтора для элементов переменного списка параметр
Здравствуйте, watchmaker, Вы писали:
W>Здравствуйте, niXman, Вы писали:
W>
X>> std::forward<F>(f)
W>
W>Не самый очевидный способ оставить в коде бомбу замедленного действия W>Кто-нибудь передаст в качестве f функцию, у которой будет перегрузка по rvalue ref-qualifier (вроде метода mf3 тут), и программа поведёт себя неожиданным образом.
W>Конечно же в правильном коде никакой std::forward вокруг f не нужен. Да и вообще непонятно зачем тут к f применять forward было — на производительность он всё равно почти никогда не повлияет, а когда повлияет, то как раз за счёт нарушения корректности программы.
ИМХО, как раз в случае подобном mf3 forward как раз и нужен — зачем-то же эта перегрузка существует? Ну а в остальных случах forward не повредит, коль скоро ни на что не влияет. Ну кроме дополнительной громоздкости кода разве что.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[4]: Вызов функтора для элементов переменного списка парам
Здравствуйте, rg45, Вы писали:
R> зачем-то же эта перегрузка существует?
Она существует для того, чтобы передать информацию о том, что мы вызвали operator() от объекта, который можно курочить как угодно потому что это последний вызов, условно говоря.
Что неправда в вышеприведённом коде.
R>ИМХО, как раз в случае подобном mf3 forward как раз и нужен
Вот более простой пример:
X>да такое сплошь и рядом делается, я просто взял за привычку делать так же. X>пример
Эти примеры используют forward правильно. А твой код нет. Вот и всё отличие :)
Ключевой момент в том, что ни в одном из этих примеров не происходит повторного обращения к f после единственного вызова.
Смотри, если f был временным объектом. То std::forward<F>(f) будет работать точно так же как и std::move(f) — собственно для этого std::forward и придумали.
Но тогда вызов for_all(create_object(), 1, 2, 3) развернётся в
Здравствуйте, watchmaker, Вы писали:
W>Эти примеры используют forward правильно. А твой код нет. Вот и всё отличие W>Ключевой момент в том, что ни в одном из этих примеров не происходит повторного обращения к f после единственного вызова.
я понял. упустил эту ключевую разницу
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: Вызов функтора для элементов переменного списка параметр
R>При этом важно сохранить порядок следования элементов. До сих пор не знаю, как лучше это реализовать, каждый раз приходится прибегать к какому-нибудь извращению типа такого:
Здравствуйте, watchmaker, Вы писали:
W>Смотри, если f был временным объектом. То std::forward<F>(f) будет работать точно так же как и std::move(f) — собственно для этого std::forward и придумали. W>Но тогда вызов for_all(create_object(), 1, 2, 3) развернётся в W>
Здравствуйте, rg45, Вы писали:
R>Может быть не эквивалентно, если f — функциональный объект с перегруженным operator() для rvalue (как здесь функция-член mf3).
мда, очередная свежая экзотика, решающая одни проблемы и создающая другие