2012-08-14 11 views
7

Warum wird first nicht als Referenz und const übergeben?Warum wird die zweite Variable als Referenz übergeben und const

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

Nur aus Neugier, wo haben Sie dieses Code-Snippet gefunden? – juanchopanza

+0

@juanchopanza war es eine Lösung für eine Übung, die wir bei uni machen mussten – code511788465541441

Antwort

7

Es kann nicht const sein, weil es innerhalb der Funktion erhöht wird, und es wird nicht als Referenz übergeben, weil es wahrscheinlich keinen Sinn macht, so für den Anrufer zu tun.

Außerdem, wenn es nicht-const Referenz wäre, wäre es nicht möglich, eine temporäre zu verwenden. Zum Beispiel, würden Sie nicht in der Lage sein tis zu tun:

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

Da es innerhalb der Funktion geändert wird, so kann es nicht const sein. Sie möchten jedoch nicht, dass sich sein Status (sein Wert) außerhalb der Funktion ändert, sodass er als Wert übergeben wird (keine Referenz).

1

Da, wenn wir den Wert des Aufrufers nicht ändern möchten, müssten wir sowieso eine Kopie erstellen.

4

Eine bessere Frage ist, warum das zweite Argument von const Referenz übergeben wird, da die Signatur in der Norm definiert ist:

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

Das heißt, beide von Wert.

Verwandte Themen