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