C++20只移动范围:gcc与istream_view副本上的叮当声[重复]

ego6inou  于 2022-12-05  发布在  其他
关注(0)|答案(1)|浏览(104)

此问题在此处已有答案

How to use std::views::transform on a vector?(1个答案)
昨天关门了。
我有一个简单的istream_view,然后我尝试在result上使用range::copy。

auto t = ranges::istream_view<int>(is);
ranges::copy(t, std::back_inserter(v));

Live example on godbolt
愚者运行正常,clang失败并显示错误:

error: no matching function for call to object of type 'const std::ranges::__copy_fn'
  ranges::copy(t, std::back_inserter(v));

可能是因为istream_view是moveonly视图。
如何在这种情况下争论谁是对的?
标准C++20 [range.istream.overview]有类似的例子:

auto ints = istringstream{"0 1 2 3 4"};
ranges::copy(ranges::istream_view<int>(ints), ostream_iterator<int>{cout, "-"});

这也会在clang中失败(这肯定是一个bug,但我不确定两个编译时错误的原因是否相同)。

yeotifhr

yeotifhr1#

看起来这是Clang编译器中std::ranges::copy函数实现的一个已知问题。根据C20标准,std::ranges::copy函数应该能够处理只移动范围,例如std::ranges::istream_view。但是,std::ranges::copy的Clang实现目前不支持只移动范围,这就是当您尝试将它用于std::ranges::istream_view对象时看到编译时错误的原因。
要解决此问题,您可以使用其他函数从std::ranges::istream_view对象(如std::move)复制元素,也可以使用愚者编译器,该编译器在std::ranges::copy函数中支持仅移动范围。
至于在这种情况下谁是对的,这取决于您对C
20标准的严格理解。该标准确实规定std::ranges::copy函数应该能够处理只移动范围,因此从这个意义上讲,Clang编译器并不严格遵守该标准。然而,std::ranges::copy的Clang实现目前也不支持只移动范围,因此从这个意义上说,愚者编译器更符合C20标准。最终,Clang编译器的开发人员将解决这个问题,使他们的实现更符合C20标准。

相关问题