7

为什么不first作为参考和常量传递?

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

4 回答 4

7

不可能是const因为它在函数内部递增,并且它不是通过引用传递的,因为它可能对调用者没有意义。

此外,如果它是非常量引用,则不可能使用临时引用。例如,您将无法这样做:

std::vector<int> v{ 1, 2, 3, 4 };
auto distance = std::distance(v.begin(), v.end());
于 2012-08-14T14:28:21.123 回答
6

因为是在函数内部改的,所以不能是const。但是,你不希望它的状态(它的值)在函数之外改变,所以它是按值传递的(不是引用)。

于 2012-08-14T14:29:22.060 回答
4

一个更好的问题是为什么第二个参数是通过 const 引用传递的,因为标准中定义的签名是:

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

也就是说,两者都是按价值计算的。

于 2012-08-14T14:39:03.783 回答
1

因为如果我们不想修改调用者的值,我们无论如何都需要创建一个副本。

于 2012-08-14T14:29:40.873 回答