2012-08-14 53 views
7

为什么不是first作为参考传递并且是const?为什么第二个变量作为参考传递并且是const

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

只是出于好奇,你在哪里找到这段代码片段? – juanchopanza 2012-08-14 14:44:53

+0

@ juanchopanza这是一个解决方案,我们不得不在uni – code511788465541441 2012-08-23 20:18:55

回答

7

它不可能是const,因为它增加的功能里面,因为它可能是没有意义的呼叫者做到这一点,是不是按引用传递。

此外,如果它是非常量引用,将不可能使用临时。例如,你将无法做到这一点:

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

因为它在函数内部被改变,所以它不能是const。但是,您不希望其状态(其值)在函数外部更改,因此它是通过值(不是引用)传递的。

1

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

4

更好的问题是为什么第二个参数是由常量引用传递,因为在标准中定义的签名是:

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

即,既通过值。