C ++ 11 Eficiencia de bucle forado basada en rango "const auto & i" frente a "auto i"

En C ++ 11, puedo iterar sobre un contenedor así:

for(auto i : vec){
   std::cout << i << std::endl;
}

Pero sé que esto innecesariamente ...innecesariamente, ya que solo necesitoimpresión los valores devec - hace una copia deEDITAR: cada elemento de)vec, así que en su lugar podría hacer:

for(auto &i : vec){
   std::cout << i << std::endl;
}

Pero quiero asegurarme de que los valores devec nunca se modifican y cumplen con la corrección de const, por lo que puedo hacer:

for(const auto &i : vec){
   std::cout << i << std::endl;
}

Así que mi pregunta es: si solo necesitoMira a los valores de algún contenedor, ¿no sería el último bucle (const auto &i) siempre será preferible debido a la mayor eficiencia de no tener una copia adicional de (EDITAR: cada elemento de)vec?

Tengo un programa que estoy desarrollando en el que estoy considerando realizar este cambio en todo momento, ya que la eficiencia es fundamental en él (la razón por la que estoy usando C ++ en el primer lugar).

Respuestas a la pregunta(2)

Su respuesta a la pregunta