Рассмотрим эту простую программу:
vector<int> foo = {0, 42, 0, 42, 0, 42};
replace(begin(foo), end(foo), foo.front(), 13);
for(const auto& i : foo) cout << i << '\t';
Когда я написал это, я ожидал получить:
13 42 13 42 13 42
Но вместо этого я получил:
13 42 0 42 0 42
Конечно, проблема состоит в том, что replace
берет за последние 2 параметра по ссылке. Поэтому, если любой из них окажется в диапазоне, на котором работают, результаты могут быть неожиданными. Я могу решить это, добавив временную переменную:
vector<int> foo = {0, 42, 0, 42, 0, 42};
const auto temp = foo.front();
replace(begin(foo), end(foo), temp, 13);
for(const auto& i : foo) cout << i << '\t';
Я знаю, что С++ 11 предоставил нам всевозможные инструменты типа, возможно ли, что я могу просто заставить это значение к не ссылочному типу и передать это inline, не создавая временные?