Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用auto在C+;中声明lambda变量的首选方法是什么+;?_C++_C++11_Lambda - Fatal编程技术网

C++ 使用auto在C+;中声明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声明lambda变量的各种方法的优缺点有什么见解吗?
例如:

 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个重载是有意义的,我系统地这样做。我希望这没什么错。