嵌套迭代器中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

