Переход к ссылочному аргументу по значению
Рассмотрим эту простую программу:
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';
Я действительно знаю, что C ++ 11 дал нам все виды инструментов типов. Возможно ли, что я мог бы просто принудительно преобразовать это значение в не-ссылочный тип и передать его в строку, не создавая временный?