我正在尝试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?
1条答案
按热度按时间tnkciper1#
我期待这句台词:
字符串
要将
{++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
被指定为:型