::reference"?-6ren"> ::reference"?-我有以下函数和 vector : template RandomIterator upperBound(RandomIterator start, RandomIterator end, cons-6ren">
gpt4 book ai didi

c++ - 为什么在 "const"中忽略 "const typename iterator_traits::reference"?

转载 作者:行者123 更新时间:2023-11-30 00:51:32 25 4
gpt4 key购买 nike

我有以下函数和 vector :

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

vector<int> v{1,2,3,3,4};

但是当我调用时它不起作用:

upperBound(v.begin(), v.end(), 1);

错误(来自 g++ 和 clang++)类似于“期望左值;无法将右值传递给 3 参数”。但是,不应该是以下两种

const typename iterator_traits<RandomIterator>::reference
const typename iterator_traits<RandomIterator>::value_type&

相当于编译器?

顺便说一下,当将函数规范更改为

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

一切正常。

最佳答案

不,它们不等同。当你有 const some_typedef , const适用于 typedef 的最外层类型。所以如果some_typedef是引用类型(在您的情况下是),然后是 const适用于引用。因为没有 const 这样的东西引用类型,const被忽略。

也就是说,如果 vector 的元素类型是 int ,然后:

  • const typename iterator_traits<RandomIterator>::reference变成 int& const这相当于 int& .
  • const typename iterator_traits<RandomIterator>::value_type&变成 const int& .

关于c++ - 为什么在 "const"中忽略 "const typename iterator_traits<RandomIterator>::reference"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21370512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com