考虑以下代码:
#include <string_view>
struct Iter
{
Iter() {}
Iter(std::string_view) {}
Iter begin() const
{
return *this;
}
};
它是一个精简的迭代器,应该用作for (auto x : Iter(...))
(与 完全相同fs::directory_iterator
)。为简洁起见,我删除end()
了所有重载的运算符,因为它们不会影响错误。
此代码使用-std=c++20
(使用 GCC 和 Clang)编译,但是一旦我切换到-std=c++2b
GCC 和带有 libstdc++ 的 Clang 拒绝它,而带有 libc++ 的 Clang 仍然接受它。
这是错误的要点:
iterator_concepts.h:945:6: error: exception specification of 'operator()<Iter>' uses itself
...
string_view:153:7: note: while checking the satisfaction of concept 'contiguous_range<const Iter &>' requested here
...
string_view:153:15: note: while substituting template arguments into constraint expression here
&& ranges::contiguous_range<_Range>
^~~~~~~~~~~~~~~~~~~~~~~~
<source>:10:16: note: while checking constraint satisfaction for template 'basic_string_view<const Iter &, Iter>' required here
return *this;
^
<source>:10:16: note: in instantiation of function template specialization 'std::basic_string_view<char>::basic_string_view<const Iter &, Iter>' requested here
如果函数未命名,则不会发生错误begin
。显然return *this;
考虑了string_view
构造函数,它检查一些概念Iter
,包括检查begin
自身。
发生了什么事,我该如何解决这个错误?
报告了libstdc++ 的错误。