我已经阅读了最新的草案,其中添加了 lazy_split_view
。
但后来我意识到,split_view
被重命名为 lazy_split_view
,而 split_view
也被更新了。
libstdc++
最近也通过使用 GCC Trunk
版本 https://godbolt.org/z/9qG5T9n5h 实现了这一功能。
我有一个简单的程序,在这个程序中展示了两个视图的用法,但我看不出它们之间的区别:
#include <iostream>
#include <ranges>
int main(){
std::string str { "one two three four" };
for (auto word : str | std::views::split(' ')) {
for (char ch : word)
std::cout << ch;
std::cout << '.';
}
std::cout << '\n';
for (auto word : str | std::views::lazy_split(' ')) {
for (char ch : word)
std::cout << ch;
std::cout << '.';
}
}
输出:
one.two.three..four.
one.two.three..four.
直到我使用std::span<const char>
来作为两个视图的时候,才注意到它们之间的差异。
在第一个视图中:std::views::split
:
for (std::span<const char> word : str | std::views::split(' '))
编译器已接受我的代码。
而在第二个示例中: std::views::lazy_split
for (std::span<const char> word : str | std::views::lazy_split(' '))
抛出编译错误。
我知道这两者之间会有区别,但是我不容易发现它们。 这是C++20中的缺陷报告还是C++23中的新功能(带有变化),或者两者都有?