You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套迭代器中std::totally_ordered与std::basic_const_iterator的编译问题

问题:std::totally_ordered 概念检查触发无限递归报错

编译以下代码时会失败,报错信息显示概念满足性检查出现自依赖的无限递归:

C:/Program Files/mingw64/include/c++/13.2.0/concepts:318:11: error:
satisfaction of atomic constraint 'requires(const typename
std::remove_reference<_Tp>::type& __t, const typename
std::remove_reference<_Arg>::type& __u) {{__t < __u} -> decltype(auto)
[requires std::__detail::__boolean_testable<, >];{__t >
__u} -> decltype(auto) [requires std::__detail::__boolean_testable<, >];{__t <= __u} ->
decltype(auto) [requires
std::__detail::__boolean_testable<, >];{__t >= __u} ->
decltype(auto) [requires
std::__detail::__boolean_testable<, >];{__u < __t} ->
decltype(auto) [requires
std::__detail::__boolean_testable<, >];{__u > __t} ->
decltype(auto) [requires
std::__detail::__boolean_testable<, >];{__u <= __t} ->
decltype(auto) [requires
std::__detail::__boolean_testable<, >];{__u >= __t} ->
decltype(auto) [requires
std::__detail::__boolean_testable<, >];} [with _Tp =
permutated_iterator<std::basic_const_iterator<__gnu_cxx::__normal_iterator<const unsigned char*, std::span<const unsigned char, 2> > >,
__gnu_cxx::__normal_iterator<int*, std::span<int, 2> > >;; _Up = permutated_iterator<std::basic_const_iterator<__gnu_cxx::__normal_iterator<const unsigned char*, std::span<const unsigned char, 2> > >,
__gnu_cxx::__normal_iterator<int*, std::span<int, 2> > >]' depends on itself

对应的代码如下:

#include <span>
#include <concepts>
#include <iterator>

using namespace std;

template<random_access_iterator T1, random_access_iterator T2>
    requires (unsigned_integral<typename iterator_traits<T1>::value_type>
              && !is_same_v<typename iterator_traits<T1>::value_type, bool>)
struct permutated_iterator
{
private:

    T1 p{}; ///< Permutation vector iterator.
    T2 v{}; ///< Permutated vector iterator.

public:

    /// Default constructor is needed from std::forward_iterator concept.
    constexpr permutated_iterator() = default;

    /** Constructor for dense permutated vector iterator.
    \param p Permutation vector iterator, pointing in current position of this iterator.
    \param v The permutated vector iterator, pointing in start of vector. */
    constexpr permutated_iterator(T1 p, T2 v) noexcept : p{p}, v{v} {}

    constexpr bool operator==(const permutated_iterator &it) const noexcept { return p == it.p; }
    constexpr auto operator<=>(const permutated_iterator &it) const noexcept { return p <=> it.p; }
};

int main()
{
    using piter = std::span<const unsigned char, 2>::iterator;
    using viter = std::span<int, 2>::iterator ;
    using cpiter = std::basic_const_iterator<piter> ;
    using iter1 = permutated_iterator<piter, viter> ;
    using iter2 = permutated_iterator<cpiter, viter>;;
    static_assert(std::totally_ordered<viter>);
    static_assert(std::totally_ordered<piter>);
    static_assert(std::totally_ordered<cpiter>);
    static_assert(std::totally_ordered<iter1>);
    static_assert(std::totally_ordered<iter2>);   // PROBLEM!!!!

    // this is ok: iter2() == iter2()
    // this is not ok: iter2() > iter2()
}    

问题现象

  • iter1的std::totally_ordered检查正常通过,但iter2的相同检查触发报错
  • iter2的==操作可以正常编译,但比较操作(如>)无法通过编译

更新说明

这是g的已知bug,已在g 15.1版本中修复。

内容的提问来源于stack exchange,提问作者Chameleon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 12:28:17