C++ 范围-v3';s zip函数适用于来自其他范围的临时变量-v3';s的功能,但不与其他人

C++ 范围-v3';s zip函数适用于来自其他范围的临时变量-v3';s的功能,但不与其他人,c++,functional-programming,c++17,temporary-objects,range-v3,C++,Functional Programming,C++17,Temporary Objects,Range V3,(这是一种后续行动。) 原始问题 下面的代码工作得很好 #包括 #包括 #包括 #包括 #包括 int main(){ autovec1=std::vector{1,2,3}; auto vec2=std::vector{“uno”、“due”、“tre”}; auto sqrt=[](auto x){返回标准::sqrt(x);}; auto vec3=vec1 | boost::Adapters::transformed(sqrt); for(auto-const&i:ranges::vie

(这是一种后续行动。)

原始问题 下面的代码工作得很好

#包括
#包括
#包括
#包括
#包括
int main(){
autovec1=std::vector{1,2,3};
auto vec2=std::vector{“uno”、“due”、“tre”};
auto sqrt=[](auto x){返回标准::sqrt(x);};
auto vec3=vec1 | boost::Adapters::transformed(sqrt);
for(auto-const&i:ranges::views::zip(vec1、vec2、vec3)){
//随便
}
}
但是,如果我不想将结果存储在
vec3
,该怎么办?好的,没有
| to_vector
vec3
只是一个视图(对吗?),所以存储它不是一个大内存使用问题,但请耐心等待。将行的
更改为以下值不起作用

for(auto-const&i:ranges::views::zip(vec1、vec2、vec1 | boost::adapters::transformed(sqrt))){
评论中的答案 根据一条评论,我只是在发布问题之前没有考虑太多问题,因为解决方案非常简单,只需使用
ranges::views::transform
而不是
boost::adapters::transformed

我还是想知道到底发生了什么 然而,在这一点上,老实说,我仍然有兴趣了解前一种解决方案的问题所在。

起初我认为
ranges::views::zip
不能处理临时变量,但上面的解决方案(斜体)证明了我的错误,因为
vec1 | ranges::views::transform(sqrt)
仍然是临时变量,而不是左值

另一方面,
ranges::views::zip(vec1,vec2,std::move(vec3))
失败,其中
std::move(vec3)
也不是左值,而是一个x值


如果有人能帮助我理解
ranges::views::zip
的特性,以及为什么它与一些临时变量(我会说那些来自其他Range-v3函数的变量)一起工作,而不是其他变量(例如xvalues来自
std::move
或真正的临时变量来自
boost:…
).

ranges::view::transform
一起工作。谢谢@Jarod42。我很愚蠢。但是,我已经更新了问题,所以我不会扔掉所有的文本:PWorks与
ranges::view::transform
一起工作。谢谢@Jarod42。我很愚蠢。但是,我已经更新了问题,所以我不会扔掉所有的文本:p