在我的回答中,巴里指出最好打电话,views::transform(&Planter::getPlants)因为views::transform([](Planter const& planter){...不小心复制了。
#if 1
auto plants = planters
| std::views::transform([](Planter const& planter){ return planter.getPlants();})
| std::views::join
| std::views::common
;
// Plant copy constructor
// Plant copy constructor
// Plant copy constructor
// Plant copy constructor
// Plant copy constructor
#else
auto plants = planters
| std::views::transform(&Planter::getPlants)
| std::views::join
;
#endif
// Plant copy constructor
// Plant copy constructor
Run Code Online (Sandbox Code Playgroud)
这Plant是一个围绕的包装器int,Planter也是一个围绕的包装器std::vector<int>。
噢,这个我还真认识。推导的 lambda 返回类型实际上衰减了 的 const ref 限定符getPlants。
您可以通过将 lambda 的返回类型声明为来解决此问题decltype(auto)
views::transform([](Planter const& planter) -> decltype(auto){...});
Run Code Online (Sandbox Code Playgroud)
https://godbolt.org/z/ocK5PG1z1