¿Cuándo debo usar el nuevo rango y puedo combinarlo con el nuevo cbegin / cend?

El nuevo ranged-for en C ++ 11 será muy conciso y útil, por supuesto. Hasta donde entiendo cómo funciona, busca los "contenedores"begin yend probando * Argument-depend-Lookup "(ADT).

Pero otra adición es que todos los contenedoresahora tienencbegin() ycend() para obtener elconst_iterators para el contenedor.

Estoy un poco confundido, por un lado, creo que debería usarcbegin() si lo hagon quiero modificar el contenedor, por otro lado tengo que agregar un @ adicionconst dentro de ranged-for para obtener lo mismo.

Entonces, se ve así:

// print all
for(const auto elem : data)
  cout << elem

using ADT, buscando data.begin (), por lo tantoconst necesario

vs

// print everything but the first (a reason not to use range-for)
for(auto it = data.cbegin()+1; it!=data.cend(); ++it)
  cout << *it

utilizandodata.cbegin(), por lo tanto noconst necesario

¿Pero esto no sería más "idiomático"?:

// print everything but the first (a reason not to use range-for)
for(const auto it = data.begin()+1; it!=data.end(); ++it)
  cout << *it
¿Entendí el "idioma" verdad? ¿Alguna adición? ¿Cuándo debo usarcbegin? ¿Echo de menos algo con ranged-for, buscandobegin() ¿solamente

Editar corrección de errorValue vs Iterator

Respuestas a la pregunta(2)

Su respuesta a la pregunta