为什么GCC的stdlibc ++定义WeaklyIncrementable迭代器需要可移动的并且它的different_type必须是整数?他们会带来什么好处?

问题描述

虽然我试图了解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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...