此问题在此处已有答案:
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,但我不确定两个编译时错误的原因是否相同)。
1条答案
按热度按时间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
函数中支持仅移动范围。至于在这种情况下谁是对的,这取决于您对C20标准的严格理解。该标准确实规定
std::ranges::copy
函数应该能够处理只移动范围,因此从这个意义上讲,Clang编译器并不严格遵守该标准。然而,std::ranges::copy
的Clang实现目前也不支持只移动范围,因此从这个意义上说,愚者编译器更符合C20标准。最终,Clang编译器的开发人员将解决这个问题,使他们的实现更符合C20标准。