c++ - 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++ 不会抱怨。
解决方案
推荐阅读
- android - 使用 Checkstyle 进行 Android 代码分析
- postgresql - PostgreSQL 11 - 程序
- c++ - 索引字符串时通过空终止符
- symfony - Symfony 3.4.11 索引的默认语言环境不起作用
- android - 如何在 git-ignore 文件 android 中添加 gradle.properties?
- python-3.x - 在 scraper.py 中使用 scrapy 自定义设置
- javascript - 在 node.js express 上使用中间件设置简单服务器时出错
- swift - 在哪里放置 UIAlert?
- php - php echo中使用'@'是什么意思?
- python-3.x - 关于斯派西的词性