Переход к ссылочному аргументу по значению

Рассмотрим эту простую программу:

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 дал нам все виды инструментов типов. Возможно ли, что я мог бы просто принудительно преобразовать это значение в не-ссылочный тип и передать его в строку, не создавая временный?

Ответы на вопрос(7)

Ваш ответ на вопрос