C++ 使用auto在C+;中声明lambda变量的首选方法是什么+;?
有人对使用auto声明lambda变量的各种方法的优缺点有什么见解吗?C++ 使用auto在C+;中声明lambda变量的首选方法是什么+;?,c++,c++11,lambda,C++,C++11,Lambda,有人对使用auto声明lambda变量的各种方法的优缺点有什么见解吗? 例如: auto Val = [] { }; // #1 const auto &LVRef = [] { }; // #2 auto &&RVRef = [] { }; // #3 有人能想出一个令人信服的理由不总是喜欢1吗 我想对于模板函数,声明可调用参数的首选方法是使用通用引用 template<class F> void foo(F&
例如:
auto Val = [] { }; // #1
const auto &LVRef = [] { }; // #2
auto &&RVRef = [] { }; // #3
有人能想出一个令人信服的理由不总是喜欢1吗
我想对于模板函数,声明可调用参数的首选方法是使用通用引用
template<class F> void foo(F&& f) { f(); }
模板void foo(F&&F){F();}
或者大多数指导原则更喜欢将其声明为非引用参数
template<class F> void foo(F f) { f(); }
模板void foo(F){F();}
谢谢大家!
有人能想出一个令人信服的理由不总是喜欢1吗
第1项更简单,与其他选项相比,没有性能损失
获取函子的算法通常只按值获取它们,但如果您想保证不出于某种原因复制函子,则使用通用引用是合理的。如果你写的东西只是转发函子,那么就使用通用引用。我实际上会说#2,因为我更喜欢区分非可变变量和非引用变量/函子,然后声明其他所有变量
常量auto&
。我更喜欢同时使用引用的原因是,您不必关心函数是否返回生成的值或引用。通过引用传递与通过副本传递对有状态函子有重大影响。使用任何一个具有您想要的行为的函数。(F&&F){std::forward(F)(;}
,就好像函子有()&&
重载,并且它作为右值传入一样,我们不想浪费它。(注意:没有人有()&&
重载)。@Yakk“没有人有()&&
重载”是什么意思?@iavr我的意思是我还没有遇到一个覆盖了操作符()&
的函子。lambdas和std::function
没有覆盖它。将其添加到标准中会很有趣。。。但有点像鸡和蛋的问题。是您可以遇到的一个:-)对于携带状态的函子,为&
,&
,常量和定义3个重载是有意义的,我系统地这样做。我希望这没什么错。