我发现 c++20与range-v3版本ranges::basic_istream_view
略有不同。
最重要的区别是sstd::ranges::basic_istream_view
不缓存其begin()
,因此每个begin()
s 将返回具有已读取值的下一个迭代器(Godbolt):
auto words = std::istringstream{"today is yesterday's tomorrow"};
auto view = std::ranges::istream_view<std::string>(words);
std::cout << *view.begin() << "\n"; // today
std::cout << *view.begin() << "\n"; // is
std::cout << *view.begin() << "\n"; // yesterday's
std::cout << *view.begin() << "\n"; // tomorrow
考虑以下(godbolt),如果我使用 range-v3 版本,所有三个std::ranges::find()
s 都会找到"is"
,但如果我使用 std 版本,"is"
只会在第一次调用中找到。
auto words = std::istringstream{"today is yesterday's tomorrow"};
auto view = std::ranges::istream_view<std::string>(words);
std::cout << *std::ranges::find(view, "is") << "\n"; // is
std::cout << *std::ranges::find(view, "is") << "\n"; // tomorrow
std::cout << *std::ranges::find(view, "is") << "\n"; // tomorrow
为什么标准选择了与 range-v3 不同的设计?begin()
如果被缓存,是否有任何潜在的缺陷?