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

Сообщение Re[4]: Вызов функтора для элементов переменного списка парам от 30.03.2017 20:58

Изменено 30.03.2017 20:59 watchmaker

Re[4]: Вызов функтора для элементов переменного списка параметр
Здравствуйте, rg45, Вы писали:

R> зачем-то же эта перегрузка существует?

Она существует для того, чтобы передать информацию о том, что мы вызвали operator() от объекта, который можно курочить как угодно потому что это последний вызов, условно говоря.
Что неправда в вышеприведённом коде.

R>ИМХО, как раз в случае подобном mf3 forward как раз и нужен

Вот более простой пример:
vector<int> v0, v1, v2, v3;
// fill v0

v1 = v0;
v2 = v0;
v3 = v0;

тут содержимое вектора v0 копируется в вектора v1,v2,v3.
А вот в этом коде происходит чёрт знает что:
v1 = std::move(v0);
v2 = std::move(v1);
v3 = std::move(v2);

Но при этом каждая строчка в отдельности — полностью корректная. Но в сумме получается совсем не копирование v0 в v1,v2,v3.

С вызовом operator() всё то же самое. Каждый вызов в отдельности правилен. А вот серия вызовов — уже не всегда.

Спасает этот код лишь то, что rvalue ref-qualifier в программах нечасто используется.
Re[4]: Вызов функтора для элементов переменного списка парам
Здравствуйте, rg45, Вы писали:

R> зачем-то же эта перегрузка существует?

Она существует для того, чтобы передать информацию о том, что мы вызвали operator() от объекта, который можно курочить как угодно потому что это последний вызов, условно говоря.
Что неправда в вышеприведённом коде.

R>ИМХО, как раз в случае подобном mf3 forward как раз и нужен

Вот более простой пример:
vector<int> v0, v1, v2, v3;
// fill v0

v1 = v0;
v2 = v0;
v3 = v0;

тут содержимое вектора v0 копируется в вектора v1,v2,v3.
А вот в этом коде происходит чёрт знает что:
v1 = std::move(v0);
v2 = std::move(v0);
v3 = std::move(v0);

При этом каждая строчка в отдельности полностью корректная. Но в сумме получается совсем не копирование v0 в v1,v2,v3.

С вызовом operator() всё то же самое. Каждый вызов в отдельности правилен. А вот серия вызовов — уже не всегда.

Спасает этот код лишь то, что rvalue ref-qualifier в программах нечасто используется.