0

C++20 添加了一个构造函数basic_string_view该构造函数需要两个迭代器。但是,当我尝试string_view使用来自公共范围的迭代器构造 a 时,我得到一个错误。

#include <iostream>
#include <ranges>

using namespace std::views;

int main()
{
    auto words = "the quick brown fox" | split(' ') | transform([]<class RNG>(RNG&& rng) {
        auto v = std::views::common(std::forward<RNG>(rng));
        return std::string_view(v.begin(), v.end());
    });
    for (auto&& word : words) {
        std::cout << word << std::endl;
    }
}

<source>:11:6:   required from here
<source>:10:21: error: no matching function for call to 'std::basic_string_view<char>::basic_string_view(std::common_iterator<std::ranges::split_view<std::ranges::ref_view<const char [20]>, std::ranges::single_view<char> >::_InnerIter<true>, std::default_sentinel_t>, std::common_iterator<std::ranges::split_view<std::ranges::ref_view<const char [20]>, std::ranges::single_view<char> >::_InnerIter<true>, std::default_sentinel_t>)'
10 |         return std::string_view(v.begin(), v.end());
    |                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

https://godbolt.org/z/E4779G

4

1 回答 1

1

请注意对迭代器构造函数的要求std::string_view

此重载仅在以下情况下参与重载决议

  • 它满足 contiguous_iterator,
  • End 满足 sized_sentinel_for 它,
  • std::iter_value_t 和 CharT 是同一类型,并且
  • End 不能转换为 std::size_t。

您的范围迭代器至少不满足第一个要求

于 2021-03-18T13:33:13.773 回答