first
参照と const としても渡されないのはなぜですか?
template <typename Iterator>
int distance(Iterator first, const Iterator & last) {
int count;
for ( ; first != last; first++)
count++;
return count;
}
first
参照と const としても渡されないのはなぜですか?
template <typename Iterator>
int distance(Iterator first, const Iterator & last) {
int count;
for ( ; first != last; first++)
count++;
return count;
}
関数内でインクリメントされるconst
ためではありません。また、呼び出し元にとっておそらく意味がないため、参照渡しされません。
さらに、それが非 const 参照である場合、temporary を使用することはできません。たとえば、次のことはできません。
std::vector<int> v{ 1, 2, 3, 4 };
auto distance = std::distance(v.begin(), v.end());
関数内で変更されるため、const にはなりません。ただし、その状態 (その値) を関数の外で変更したくないため、(参照ではなく) 値で渡されます。
より良い質問は、標準で定義されている署名が次のとおりであるため、2 番目の引数が const 参照によって渡される理由です。
template <typename Iterator>
typename iterator_traits<InputIterator>::difference_type
distance(InputIterator first, InputIterator last);
つまり、両方とも値です。
呼び出し元の値を変更したくない場合は、とにかくコピーを作成する必要があるためです。