问题描述
虽然我试图了解ostream_joiner的std :: ranges算法需求概念失败的惨败,但我发现WeaklyIncrementable迭代器的GCC实现看上去与标准有些不同。
GCC 10.2 stdlibc ++“ iterator_concept.h”定义了weak_incrementable也需要
- 可移动
- __ is_signed_integer_like
>
似乎要求Iter :: different_type是有符号整数或可以是“ long long”。
template<typename _Tp> requires requires { typename _Tp::difference_type; }
struct incrementable_traits<_Tp>
{ using difference_type = typename _Tp::difference_type; };
template<typename _Tp>
requires (!requires { typename _Tp::difference_type; }
&& requires(const _Tp& __a,const _Tp& __b)
{
requires (!is_void_v<remove_pointer_t<_Tp>>); // PR c++/78173
{ __a - __b } -> integral;
})
struct incrementable_traits<_Tp>
{
using difference_type
= make_signed_t<decltype(std::declval<_Tp>() - std::declval<_Tp>())>;
};
...
template<typename _Tp>
using iter_difference_t = __detail::__iter_diff_t<remove_cvref_t<_Tp>>;
...
using __max_diff_type = long long;
...
template<typename _Tp>
concept __is_signed_integer_like = signed_integral<_Tp>
|| same_as<_Tp,__max_diff_type>;
...
/// Requirements on types that can be incremented with ++.
template<typename _Iter>
concept weakly_incrementable = default_initializable<_Iter>
&& movable<_Iter>
&& requires(_Iter __i)
{
typename iter_difference_t<_Iter>;
requires __detail::__is_signed_integer_like<iter_difference_t<_Iter>>;
{ ++__i } -> same_as<_Iter&>;
__i++;
};
这似乎比仅要求std :: copyable的标准中的semiregular更为严格。
为什么?他们会带来什么好处?
编写满足WeaklyIncrementable迭代器的ostream_joiner是好事/可能/应该吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)