给定
auto empty_line = [](auto& str){ return str.size() == 0; };
ranges::getlines
对于返回一个拥有 view_facade
其正面迭代器的缓冲区的事实。
所以我们有义务在传递给算法之前将这种范围设为左值。
auto line_range1 = ranges::getlines(std::cin);
auto iter1 = ranges::find_if_not(line_range1,empty_line);
auto input1 = std::stoi(*iter1);
还有一个很酷的保护机制可以防止迭代器的所有取消引用在时间已经被破坏的数据,并使那些尝试编译时错误。
因此,当所有权作为rvalueview_facade
传递给算法时,保护会在取消引用时进行。
这不会编译。
auto iter2 = ranges::find_if_not(ranges::getlines(std::cin),empty_line);
// at this point the `owning` range destroyed,
// so as the buffer we (should've) hold (before!).
// So this won't compile
// auto input2 = std::stoi(*iter2);
错误为:
<source>:19:29: error: no match for 'operator*' (operand type is 'ranges::v3::dangling<ranges::v3::_basic_iterator_::basic_iterator<ranges::v3::getlines_range::cursor> >')
auto input2 = std::stoi(*iter2);
^~~~~~
这也不会编译。
// Won't compile
// auto input3 = std::stoi(*ranges::find_if_not(ranges::getlines(std::cin),
// empty_line)
// );
错误为:
<source>:22:29: error: no match for 'operator*' (operand type is 'ranges::v3::safe_iterator_t<ranges::v3::getlines_range> {aka ranges::v3::dangling<ranges::v3::_basic_iterator_::basic_iterator<ranges::v3::getlines_range::cursor> >}')
auto input3 = std::stoi(*ranges::find_if_not(ranges::getlines(std::cin),empty_line));
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我的问题是,除了文档之外,是否有任何特征或任何类型的范围约定来检查范围类型是否拥有?
也许,像constexpr bool is_owning_v(Rng&&)