2012-08-14 7 views
7

¿Por qué no se pasa first como referencia y const también?¿Por qué la segunda variable se pasa como referencia y const

template <typename Iterator> 
    int distance(Iterator first, const Iterator & last) { 
    int count; 
    for (; first != last; first++) 
     count++; 
    return count; 
} 
+1

Solo por curiosidad, ¿dónde encontraste este fragmento de código? – juanchopanza

+0

@juanchopanza fue una solución a un ejercicio que tuvimos que hacer en la uni – code511788465541441

Respuesta

7

No puede ser const porque se incrementa dentro de la función, y no se pasa por referencia, ya que probablemente no tiene sentido hacerlo por la persona que llama.

Además, si no fuera referencia constante, no sería posible usar un temporal. Por ejemplo, usted no sería capaz de hacer tis:

std::vector<int> v{ 1, 2, 3, 4 }; 
auto distance = std::distance(v.begin(), v.end()); 
6

Debido a que se cambia dentro de la función, por lo que no puede ser const. Sin embargo, no querría que su estado (su valor) cambie fuera de la función, por lo que se pasa por valor (no como referencia).

1

Porque si no queremos modificar el valor de la persona que llama, tendremos que crear una copia de todos modos.

4

Una mejor pregunta es ¿por qué el segundo argumento se pasa por referencia constante, ya que la firma definida en el estándar es:

template <typename Iterator> 
typename iterator_traits<InputIterator>::difference_type 
distance(InputIterator first, InputIterator last); 

Es decir, tanto por su valor.

Cuestiones relacionadas