为什么在"const typename iterator_traits <RandomIterator> :: reference"中忽略"const"?

use*_*202 1 c++ iterator const reference value-type

我有以下功能和矢量:

template <class RandomIterator>  RandomIterator upperBound(RandomIterator start, RandomIterator end, const typename iterator_traits<RandomIterator>::reference t);

vector<int> v{1,2,3,3,4};
Run Code Online (Sandbox Code Playgroud)

但是当我打电话时它不起作用:

upperBound(v.begin(), v.end(), 1);
Run Code Online (Sandbox Code Playgroud)

错误(来自g ++和clang ++)有点像"期待左值;不能将rvalue传递给3参数".但是,不应该有以下两种类型

const typename iterator_traits<RandomIterator>::reference
const typename iterator_traits<RandomIterator>::value_type&
Run Code Online (Sandbox Code Playgroud)

相当于编译器?

通过这种方式,将功能规格更改为

template <class RandomIterator>  RandomIterator upperBound(RandomIterator start, RandomIterator end, const typename iterator_traits<RandomIterator>::value_type& t);
Run Code Online (Sandbox Code Playgroud)

一切正常.

Jos*_*eld 6

不,他们不等同.如果有const some_typedef,则const适用于typedef的最外层类型.因此,如果some_typedef是引用类型(在您的情况下是它),则const适用于引用.由于没有const引用类型这样的东西,所以const会被忽略.

也就是说,如果向量的元素类型是int,则:

  • const typename iterator_traits<RandomIterator>::reference变得int& const等同于正义int&.
  • const typename iterator_traits<RandomIterator>::value_type&成为const int&.