以下简单程序编译并工作:
std::generator<int> get_ints(int n)
{
for (int i{0}; i < n; ++i)
co_yield i;
}
int main(int argc, char* argv[])
{
std::vector<float> floats { 0.0f, 1.0f, 2.0f, 3.0f };
for (auto [i, f] : std::views::zip(get_ints(4), floats))
std::println("{}: {}", i, f);
}
但是,如果我将生成器存储在变量中并尝试相同的操作,它将无法编译:
std::generator<int> get_ints(int n)
{
for (int i{0}; i < n; ++i)
co_yield i;
}
int main(int argc, char* argv[])
{
std::vector<float> floats { 0.0f, 1.0f, 2.0f, 3.0f };
auto ints = get_ints(4);
for (auto [i, f] : std::views::zip(ints, floats))
std::println("{}: {}", i, f);
}
据我所知,这是失败的,因为
std::ranges::viewable_range<std::generator<int>&>
评估为
false
,而
std::ranges::viewable_range<std::generator<int>&&>
评估结果为true。但为什么第一种情况被禁止?我知道
generator
它不是一个范围,但它的行为就像我测试过的其他所有范围类型(尽管我只测试了一些)在作为左值引用传递时都满足这个约束。那么为什么做
发电机
在这种情况下特别吗?