2

考虑以下代码:

run on gcc.godbolt.org

#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++2bGCC 和带有 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++ 的错误。

4

0 回答 0