c++ - 为什么我不能在 c++20 中的 istream_view 之后使用 take()
问题描述
代码显示了我的问题,我不能使用take(3)
after istream_view
。
错误信息是:
/home/linuxbrew/.linuxbrew/Cellar/gcc/11.1.0_1/include/c++/11.1.0/ranges:1775:48:错误:传递'std::ranges::take_view<std::ranges::transform_view< std::ranges::basic_istream_view<int, char, std::char_traits >, int ( )(int)> >::_CI' {aka 'const std::counted_iterator<std::ranges::transform_view<std::范围::basic_istream_view<int, char, std::char_traits >, int ( )(int)>::_Iterator >'} as '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 发布几周后发布的此提交),但 gcc trunk 现在包含此修复程序。
推荐阅读
- mysql - MYSQL不正确的DOUBLE值Python 3
- python - 如何显示使用 PIL 操作的上传图像而不保存到文件 Django
- gnuplot - gnuplot:如何正确解释负面时间?
- indexing - Solr 无法搜索 nutch 爬网条目,尽管字段被标记为 indexed = true
- python - ValueError:Keras DQN 代理的输入形状错误
- email - Apple iOS 邮件应用程序中的电子邮件没有 html 正文
- node.js - 如何访问脚本标签内的 JSON 对象?
- javascript - React Fetch On Event - 最佳实践
- ios - 将构建设置从应用程序目标传递到依赖项
- python - python webscraping的问题