Pasar a un argumento de referencia por valor
Considere este sencillo programa:
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';
Cuando lo escribí esperaba:
13 42 13 42 13 42
Pero en cambio obtuve:
13 42 0 42 0 42
El problema, por supuesto, es quereplace
toma los 2 últimos parámetros por referencia. Entonces, si alguno de ellos está en el rango que se está operando, los resultados pueden ser inesperados. yopuede resuelva esto agregando una variable temporal:
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';
Sé que C ++ 11 nos dio todo tipo de herramientas de tipo. ¿Es posible que simplemente pueda forzar este valor a un tipo sin referencia y pasarlo en línea, sin crear el temporal?