如何解决为什么我不能在 c++20 中的 istream_view 之后使用 take()
代码显示了我的问题,我不能在 take(3)
之后使用 istream_view
。
错误信息是:
/home/linuxbrew/.linuxbrew/Cellar/gcc/11.1.0_1/include/c++/11.1.0/ranges:1775:48: 错误:传递 'std::ranges::take_view<:ranges: :transform_view char std::char_traits>,int ()(int)> >::_CI' {aka 'const std::counted_iterator<:ranges: :transform_view char std::char_traits>,int ()(int)>::_Iterator >'} 作为 'this' 参数丢弃限定符 [-fpermissive] 1775 | { 返回 __y.count() == 0 || __y.base() == __x._M_end; }
#include <ranges>
using namespace std::views;
using namespace std::ranges;
int to_sq(int a){return a*a;}
int main()
{
auto m_range = istream_view<int>(std::cin);
// error
for (auto i : m_range | transform(to_sq)|take(3))
{
std::cout << i << std::endl;
}
}
解决方法
这是LWG 3391。
这里的 transform
无关紧要,只是尝试迭代 istream_view<int>(std::cin) | views::take(3)
已经是一个问题。从问题:
代码无效,因为 ranges::take_view::sentinel::operator==()
必须调用 counted_iterator::base()
将底层迭代器与其哨兵进行比较,因此此 operator==()
要求底层迭代器是可复制构造的。
gcc 11.1 尚未包含此修复程序(特别是在 11.1 发布几周后发布的 this commit),但 gcc trunk 现在包含了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。