c++ std::vector< int>::iterator的类型在你用'++'递增时会改变吗?

ncecgwcz  于 2023-08-09  发布在  其他
关注(0)|答案(1)|浏览(85)

我正在尝试C20的概念,遇到了一个我无法解释的奇怪问题。
我试图定义一个concept,它检查给定的迭代器是否可以递增(很好),并且还检查类型不会因此而改变(不好)。
原谅我的无知,我错过了什么?错误的最后一行指出:
'注意:'
it'不满足返回类型要求{ ++it } -> std::same_as;'

#include <functional>
#include <vector>

template<typename Iter>
concept Iterable = requires(Iter it){
    { ++it } // Check iterator can be incremented (compiles but does not check return type)
    { ++it } -> std::same_as<Iter>; // Also check the return type (**fails**)
};

template<typename Iter>
requires Iterable<Iter>
void doesNothing(Iter current, Iter end){
    while(current != end){
        ++current;
    }
};

int main(){
    std::vector<int> v = {1, 2, 3};
    doesNothing(v.begin(), v.end());
    return 0;
}

字符串
先谢谢你。
我期待这句台词:

{ ++it } -> std::same_as<Iter>;


要将{++it}的返回值'管道'到模板std::same_as<T, U>中,结果是std::same_as<std::vector<int>::iterator, std::vector<int>::iterator>,这当然是可以接受的。
编辑:巴里的精彩回答与此有关:Why does decltype(auto) return a reference here?

tnkciper

tnkciper1#

我期待这句台词:

{ ++it } -> std::same_as<Iter>;

字符串
要将{++it}的返回值'管道'到模板std::same_as<T, U>中,结果是std::same_as<std::vector<int>::iterator, std::vector<int>::iterator>,这当然是可以接受的。
你说对了一半
{ ++it } -> std::same_as<Iter>的意思是我们正在检查++it是一个有效的表达式,并且std::same_as<decltype((++it)), Iter>成立,这是正确的。
但是decltype((+it))不是Iter。是Iter&这就是为什么你的支票不能兑现。
这就是为什么std::weakly_incrementable被指定为:

template<class I>
  concept weakly_incrementable =
    movable<I> &&
    requires(I i) {
      typename iter_difference_t<I>;
      requires is-signed-integer-like<iter_difference_t<I>>;
      { ++i } -> same_as<I&>;   // not required to be equality-preserving
      i++;                      // not required to be equality-preserving
    };

相关问题