首页 > 解决方案 > C++20:当 std::lexicographical_compare_three_way 第三个和第四个参数是反向迭代器时,g++ 内部编译器错误

问题描述

当我尝试编译这段代码时

#include <iostream>
#include <vector>
#include <algorithm>

int main(){
    std::vector<int> d={1,2};
    std::vector<int> e={1,2};
    std::cout << (std::lexicographical_compare_three_way(d.begin(),d.end(),e.rbegin(),e.rend())==0) << std::endl;
    return 0;
}

使用 gcc 11.1.0 和这个标志

-Wall -Wextra -pedantic -std=c++20

我从 g++ 得到这个输出:

In file included from c:\program files\mingw-w64\winlibs-x86_64-posix-seh-gcc-11.1.0-mingw-w64-8.0.0-r1\mingw64\include\c++\11.1.0\bits\char_traits.h:39,
                 from c:\program files\mingw-w64\winlibs-x86_64-posix-seh-gcc-11.1.0-mingw-w64-8.0.0-r1\mingw64\include\c++\11.1.0\ios:40,
                 from c:\program files\mingw-w64\winlibs-x86_64-posix-seh-gcc-11.1.0-mingw-w64-8.0.0-r1\mingw64\include\c++\11.1.0\ostream:38,
                 from c:\program files\mingw-w64\winlibs-x86_64-posix-seh-gcc-11.1.0-mingw-w64-8.0.0-r1\mingw64\include\c++\11.1.0\iostream:39,
                 from test2.cpp:1:
c:\program files\mingw-w64\winlibs-x86_64-posix-seh-gcc-11.1.0-mingw-w64-8.0.0-r1\mingw64\include\c++\11.1.0\bits\stl_algobase.h: In instantiation of 'constexpr decltype (__comp((* __first1), (* __first2))) std::lexicographical_compare_three_way(_InputIter1, _InputIter1, _InputIter2, _InputIter2, _Comp) [with _InputIter1 = __gnu_cxx::__normal_iterator<int*, std::vector<int> >; _InputIter2 = std::reverse_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >; _Comp = std::compare_three_way; decltype (__comp((* __first1), (* __first2))) = std::strong_ordering]':
c:\program files\mingw-w64\winlibs-x86_64-posix-seh-gcc-11.1.0-mingw-w64-8.0.0-r1\mingw64\include\c++\11.1.0\bits\stl_algobase.h:1872:35:   required from 'constexpr auto std::lexicographical_compare_three_way(_InputIter1, _InputIter1, _InputIter2, _InputIter2) [with _InputIter1 = __gnu_cxx::__normal_iterator<int*, std::vector<int> >; _InputIter2 = std::reverse_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >]'
test2.cpp:8:54:   required from here
c:\program files\mingw-w64\winlibs-x86_64-posix-seh-gcc-11.1.0-mingw-w64-8.0.0-r1\mingw64\include\c++\11.1.0\bits\stl_algobase.h:1861:24:   in 'constexpr' expansion of 'std::operator==<__gnu_cxx::__normal_iterator<int*, std::vector<int> >, __gnu_cxx::__normal_iterator<int*, std::vector<int> > >(((const std::reverse_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >&)(& __first2)), ((const std::reverse_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >&)(& __last2)))'
c:\program files\mingw-w64\winlibs-x86_64-posix-seh-gcc-11.1.0-mingw-w64-8.0.0-r1\mingw64\include\c++\11.1.0\bits\stl_iterator.h:494:22:   in 'constexpr' expansion of '(& __x)->std::reverse_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >::base()'
c:\program files\mingw-w64\winlibs-x86_64-posix-seh-gcc-11.1.0-mingw-w64-8.0.0-r1\mingw64\include\c++\11.1.0\bits\stl_algobase.h:1861:36: internal compiler error: in cxx_eval_indirect_ref, at cp/constexpr.c:4976
 1861 |       return (__first2 == __last2) <=> true; // See PR 94006
      |              ~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~
libbacktrace could not find executable to open
Please submit a full bug report,
with preprocessed source if appropriate.
See <https://gcc.gnu.org/bugs/> for instructions.

这是编译器错误吗?

仅当第三个和第四个参数是反向迭代器时,我才会收到此错误。如果我在第一个和第二个参数中使用反向迭代器,而不是在第三个和第四个参数中,g++ 不会抱怨。

标签: c++g++c++20

解决方案


推荐阅读