当我在C+;中使用范围时,为什么管道操作符不工作+;20? 我现在正在从图书专家C++的例子中工作。

当我在C+;中使用范围时,为什么管道操作符不工作+;20? 我现在正在从图书专家C++的例子中工作。,c++,functional-programming,c++20,C++,Functional Programming,C++20,在第7章中,他们提供了将函数映射到矩阵的以下代码: #include <vector> #include <ranges> #include <iostream> using IntMatrix = std::vector<std::vector<int>>; int count_evens(const std::vector<int>& number_line) { return std::count_

在第7章中,他们提供了将函数映射到矩阵的以下代码:

#include <vector>
#include <ranges>
#include <iostream>

using IntMatrix = std::vector<std::vector<int>>;

int count_evens(const std::vector<int>& number_line) {
    return std::count_if(number_line.begin(),
                         number_line.end(), [](int num){return num % 2 == 0;});
}

std::vector<int> count_all_evens(const IntMatrix& numbers)
{
    return numbers | std::ranges::views::transform(count_evens); // ERROR APPEARS HERE AT |
}

int main()
{
    IntMatrix m{{1, 2, 3}, {4, 5, 6}};
    for (auto item : count_all_evens(m)) {
        std::cout << item << " ";
    }
    std::cout << std::endl;
    return 0;
}
#包括
#包括
#包括
使用IntMatrix=std::vector;
整数计数偶数(常数标准::向量和数字线){
返回std::count\u if(number\u line.begin(),
number_line.end(),[](int num){return num%2==0;});
}
标准::矢量计数所有偶数(常数矩阵和数字)
{
返回数字| std::ranges::views::transform(count_evens);//此处出现错误|
}
int main()
{
整数矩阵m{{1,2,3},{4,5,6};
用于(自动项目:计数所有偶数(m)){
std::cout
std::矢量计数\u所有偶数(常数IntMatrix和数字)
{
自动查看=数字|标准::范围::视图::转换(计数为偶数);
返回{view.begin(),view.end()};
}
有一种方法可以让这变得不那么糟糕

std::vector<int> count_all_evens(const IntMatrix& numbers)
{
  auto view = numbers | std::ranges::views::transform(count_evens);
  return std::ranges::to<std::vector<int>>(view);
}
std::向量计数所有偶数(常量整数矩阵和数字)
{
自动查看=数字|标准::范围::视图::转换(计数为偶数);
返回std::ranges::to(视图);
}
你也可以得到幻想

template<class Range>
struct to_container {
  Range&& r;
  template<class Container>
  operator Container()&&{ return {r.begin(), r.end()}; }
};
template<class Range>
to_container(Range&&)->to_container<Range>;

std::vector<int> count_all_evens(const IntMatrix& numbers)
{
  return to_container{ numbers | std::ranges::views::transform(count_evens) };
}
模板
结构到容器{
射程&r;
模板
运算符容器()&&{return{r.begin(),r.end()};}
};
模板
至_容器(范围&)->至_容器;
标准::矢量计数所有偶数(常数矩阵和数字)
{
返回容器{numbers | std::ranges::views::transform(count|evens)};
}
std::向量计数所有偶数(常数矩阵和数字)
{
自动查看=数字|标准::范围::视图::转换(计数为偶数);
返回{view.begin(),view.end()};
}
有一种方法可以让这变得不那么糟糕

std::vector<int> count_all_evens(const IntMatrix& numbers)
{
  auto view = numbers | std::ranges::views::transform(count_evens);
  return std::ranges::to<std::vector<int>>(view);
}
std::向量计数所有偶数(常量整数矩阵和数字)
{
自动查看=数字|标准::范围::视图::转换(计数为偶数);
返回std::ranges::to(视图);
}
你也可以得到幻想

template<class Range>
struct to_container {
  Range&& r;
  template<class Container>
  operator Container()&&{ return {r.begin(), r.end()}; }
};
template<class Range>
to_container(Range&&)->to_container<Range>;

std::vector<int> count_all_evens(const IntMatrix& numbers)
{
  return to_container{ numbers | std::ranges::views::transform(count_evens) };
}
模板
结构到容器{
射程&r;
模板
运算符容器()&&{return{r.begin(),r.end()};}
};
模板
至_容器(范围&)->至_容器;
标准::矢量计数所有偶数(常数矩阵和数字)
{
返回容器{numbers | std::ranges::views::transform(count|evens)};
}

错误不在管道上。错误是管道的结果表达式不能转换为
向量
。这本书确实有这个例子?这是无效的。不幸的是。你可以在这里看到源代码:不是很“专家”甚至不尝试编译你放在书中的一个例子…错误不在管道上。错误是管道的结果表达式不能转换为
vector
。这本书真的有这个例子吗?这是无效的。不幸的是。你可以在这里看到源代码:不是很“专家”甚至不尝试编译你放在书中的一个例子……或者只是返回
auto
,因为我们只是循环,实际上不需要将结果收集到
向量中
@Barry,我对这个签名有一点怀疑;一个
常量IntMatrix&
可能是临时的,所以我们会返回一个其生存期为ext的值默认值不足以有效。例如,
for(自动项:count_all_evens(GetMatrix())| backwards)
segfaults。但是只有一点点怀疑。或者只是返回
auto
,因为我们只是循环,实际上不需要将结果收集到
向量中
@Barry,我会对该签名的auto有一点点怀疑;
常量IntMatrix&
可能是临时的,所以我们会返回一个生命期扩展不为足够有效。例如,
for(自动项:count_all_evens(GetMatrix())| backwards)
segfaults。但只有一点点怀疑。