在gcc主干上使用-fconcepts对std::list进行排序时出现预期的编译器错误?

在gcc主干上使用-fconcepts对std::list进行排序时出现预期的编译器错误?,gcc,c++-concepts,Gcc,C++ Concepts,首先,资料来源: #include <list> #include <algorithm> using namespace std; int main(int argc, const char* argv[]) { list<int> l = {3,-1,10}; sort(begin(l), end(l)); return 0; } 然而,我看到的是: In file included from /usr/local/inclu

首先,资料来源:

#include <list>
#include <algorithm>

using namespace std;

int main(int argc, const char* argv[]) {
    list<int> l = {3,-1,10};
    sort(begin(l), end(l));
    return 0;
}
然而,我看到的是:

In file included from /usr/local/include/c++/7.0.1/algorithm:62:0,
                 from concepts.cpp:2:
/usr/local/include/c++/7.0.1/bits/stl_algo.h: In instantiation of ‘void std::__sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = std::_List_iterator<int>; _Compare = __gnu_cxx::__ops::_Iter_less_iter]’:
/usr/local/include/c++/7.0.1/bits/stl_algo.h:4822:18:   required from ‘void std::sort(_RAIter, _RAIter) [with _RAIter = std::_List_iterator<int>]’
concepts.cpp:8:26:   required from here
/usr/local/include/c++/7.0.1/bits/stl_algo.h:1969:22: error: no match for ‘operator-’ (operand types are ‘std::_List_iterator<int>’ and ‘std::_List_iterator<int>’)
     std::__lg(__last - __first) * 2,
               ~~~~~~~^~~~~~~~~
In file included from /usr/local/include/c++/7.0.1/bits/stl_algobase.h:67:0,
                 from /usr/local/include/c++/7.0.1/list:60,
                 from concepts.cpp:1:
/usr/local/include/c++/7.0.1/bits/stl_iterator.h:389:5: note: candidate: template<class _IteratorL, class _IteratorR> decltype ((__y.base() - __x.base())) std::operator-(const std::reverse_iterator<_Iterator>&, const std::reverse_iterator<_IteratorR>&)
     operator-(const reverse_iterator<_IteratorL>& __x,
     ^~~~~~~~
/usr/local/include/c++/7.0.1/bits/stl_iterator.h:389:5: note:   template argument deduction/substitution failed:
In file included from /usr/local/include/c++/7.0.1/algorithm:62:0,
                 from concepts.cpp:2:
/usr/local/include/c++/7.0.1/bits/stl_algo.h:1969:22: note:   ‘std::_List_iterator<int>’ is not derived from ‘const std::reverse_iterator<_Iterator>’
     std::__lg(__last - __first) * 2,
               ~~~~~~~^~~~~~~~~
In file included from /usr/local/include/c++/7.0.1/bits/stl_algobase.h:67:0,
                 from /usr/local/include/c++/7.0.1/list:60,
                 from concepts.cpp:1:
/usr/local/include/c++/7.0.1/bits/stl_iterator.h:1191:5: note: candidate: template<class _IteratorL, class _IteratorR> decltype ((__x.base() - __y.base())) std::operator-(const std::move_iterator<_IteratorL>&, const std::move_iterator<_IteratorR>&)
     operator-(const move_iterator<_IteratorL>& __x,
     ^~~~~~~~
/usr/local/include/c++/7.0.1/bits/stl_iterator.h:1191:5: note:   template argument deduction/substitution failed:
In file included from /usr/local/include/c++/7.0.1/algorithm:62:0,
                 from concepts.cpp:2:
/usr/local/include/c++/7.0.1/bits/stl_algo.h:1969:22: note:   ‘std::_List_iterator<int>’ is not derived from ‘const std::move_iterator<_IteratorL>’
     std::__lg(__last - __first) * 2,
               ~
在/usr/local/include/c++/7.0.1/算法:62:0中包含的文件中,
来自概念。cpp:2:
/usr/local/include/c++/7.0.1/bits/stl_algo.h:“void std::_排序(_RandomAccessIterator,_RandomAccessIterator,_Compare)[with _RandomAccessIterator=std:_List_iterator;_Compare=_gnucxx:_ops::_Iter_less_Iter]:
/usr/local/include/c++/7.0.1/bits/stl_-algo.h:4822:18:来自“void-std::sort(_-RAIter,_-RAIter)[带_-RAIter=std::_-List\u迭代器]”的必填项
概念。cpp:8:26:此处为必填项
/usr/local/include/c++/7.0.1/bits/stl_-algo.h:1969:22:错误:与“运算符-”不匹配(操作数类型为“std::_-List_-iterator”和“std:_-List_-iterator”)
标准::uuu lg(uuu last-uuu first)*2,
~~~~~~~^~~~~~~~~
在/usr/local/include/c++/7.0.1/bits/stl_algobase.h:67:0中包含的文件中,
从/usr/local/include/c++/7.0.1/list:60,
来自概念。cpp:1:
/usr/local/include/c++/7.0.1/bits/stl_迭代器.h:389:5:注:候选:模板decltype((uu y.base()-u x.base()))std::operator-(const std::reverse_迭代器&,const std::reverse_迭代器&)
运算符-(常量反向迭代器和,
^~~~~~~~
/usr/local/include/c++/7.0.1/bits/stl_迭代器。h:389:5:注意:模板参数推导/替换失败:
在/usr/local/include/c++/7.0.1/算法:62:0中包含的文件中,
来自概念。cpp:2:
/usr/local/include/c++/7.0.1/bits/stl_algo.h:1969:22:注意:“std::_List_iterator”不是从“const std::reverse_iterator”派生而来的
标准::uuu lg(uuu last-uuu first)*2,
~~~~~~~^~~~~~~~~
在/usr/local/include/c++/7.0.1/bits/stl_algobase.h:67:0中包含的文件中,
从/usr/local/include/c++/7.0.1/list:60,
来自概念。cpp:1:
/usr/local/include/c++/7.0.1/bits/stl_iterator.h:1191:5:注:候选:模板decltype((uuu x.base()-u y.base()))std::operator-(const std::move_iterator&,const std::move_iterator&)
运算符-(常量移动\u迭代器&\u x,
^~~~~~~~
/usr/local/include/c++/7.0.1/bits/stl_迭代器。h:1191:5:注意:模板参数推导/替换失败:
在/usr/local/include/c++/7.0.1/算法:62:0中包含的文件中,
来自概念。cpp:2:
/usr/local/include/c++/7.0.1/bits/stl_algo.h:1969:22:注意:“std::_List_iterator”不是从“const std::move_iterator”派生的
标准::uuu lg(uuu last-uuu first)*2,
~

…这是我所期望的没有概念的输出。

我知道现在已经很晚了,您可能已经找到了答案,但对于其他人来说,用户出现错误的原因是因为他使用排序函数对负值进行排序。stl排序只接受正值。

我认为这个概念不适用图书馆。也许一旦TS完成并实施,你会看到一些不同的东西。你会认为是一个令人满意的答案吗?
$ /usr/local/bin/g++ --version
g++ (GCC) 7.0.1 20170401 (experimental)
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ /usr/local/bin/g++ -fconcepts concepts.cpp -o concepts
In file included from /usr/local/include/c++/7.0.1/algorithm:62:0,
                 from concepts.cpp:2:
/usr/local/include/c++/7.0.1/bits/stl_algo.h: In instantiation of ‘void std::__sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = std::_List_iterator<int>; _Compare = __gnu_cxx::__ops::_Iter_less_iter]’:
/usr/local/include/c++/7.0.1/bits/stl_algo.h:4822:18:   required from ‘void std::sort(_RAIter, _RAIter) [with _RAIter = std::_List_iterator<int>]’
concepts.cpp:8:26:   required from here
/usr/local/include/c++/7.0.1/bits/stl_algo.h:1969:22: error: no match for ‘operator-’ (operand types are ‘std::_List_iterator<int>’ and ‘std::_List_iterator<int>’)
     std::__lg(__last - __first) * 2,
               ~~~~~~~^~~~~~~~~
In file included from /usr/local/include/c++/7.0.1/bits/stl_algobase.h:67:0,
                 from /usr/local/include/c++/7.0.1/list:60,
                 from concepts.cpp:1:
/usr/local/include/c++/7.0.1/bits/stl_iterator.h:389:5: note: candidate: template<class _IteratorL, class _IteratorR> decltype ((__y.base() - __x.base())) std::operator-(const std::reverse_iterator<_Iterator>&, const std::reverse_iterator<_IteratorR>&)
     operator-(const reverse_iterator<_IteratorL>& __x,
     ^~~~~~~~
/usr/local/include/c++/7.0.1/bits/stl_iterator.h:389:5: note:   template argument deduction/substitution failed:
In file included from /usr/local/include/c++/7.0.1/algorithm:62:0,
                 from concepts.cpp:2:
/usr/local/include/c++/7.0.1/bits/stl_algo.h:1969:22: note:   ‘std::_List_iterator<int>’ is not derived from ‘const std::reverse_iterator<_Iterator>’
     std::__lg(__last - __first) * 2,
               ~~~~~~~^~~~~~~~~
In file included from /usr/local/include/c++/7.0.1/bits/stl_algobase.h:67:0,
                 from /usr/local/include/c++/7.0.1/list:60,
                 from concepts.cpp:1:
/usr/local/include/c++/7.0.1/bits/stl_iterator.h:1191:5: note: candidate: template<class _IteratorL, class _IteratorR> decltype ((__x.base() - __y.base())) std::operator-(const std::move_iterator<_IteratorL>&, const std::move_iterator<_IteratorR>&)
     operator-(const move_iterator<_IteratorL>& __x,
     ^~~~~~~~
/usr/local/include/c++/7.0.1/bits/stl_iterator.h:1191:5: note:   template argument deduction/substitution failed:
In file included from /usr/local/include/c++/7.0.1/algorithm:62:0,
                 from concepts.cpp:2:
/usr/local/include/c++/7.0.1/bits/stl_algo.h:1969:22: note:   ‘std::_List_iterator<int>’ is not derived from ‘const std::move_iterator<_IteratorL>’
     std::__lg(__last - __first) * 2,
               ~