lambda 和成员函数指针的区别

Tom*_*ton 7 c++ std-ranges

在我的回答中巴里指出最好打电话,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是一个围绕的包装器intPlanter也是一个围绕的包装器std::vector<int>

https://godbolt.org/z/dr7PM5Tvd

Tom*_*ton 7

噢,这个我还真认识。推导的 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

  • @UserUsing是的,`getPlants`的返回类型是`Planter const&amp;`,但是如果没有`decltype(auto)`,lambda的返回类型只是`Planter` (2认同)