【发布时间】:2023-03-20 05:19:01
【问题描述】:
我发现c++20 ranges::basic_istream_view与range-v3版本略有不同。
最重要的区别是std::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()被缓存,会不会有潜在的缺陷?
【问题讨论】:
标签: c++ c++20 range-v3 std-ranges