有没有人对使用auto声明lambda变量的各种方法的利弊有所了解? 例如:
auto Val = [] { }; // #1
const auto &LVRef = [] { }; // #2
auto &&RVRef = [] { }; // #3
任何人都可以想到一个令人信服的理由并不总是喜欢#1吗?
我想对于模板函数,声明可调参数的首选方法是使用通用引用?
template<class F> void foo(F&& f) { f(); }
或者大多数指南都倾向于将其声明为非参考参数?
template<class F> void foo(F f) { f(); }
谢谢!
答案 0 :(得分:2)
任何人都可以想到一个令人信服的理由并不总是喜欢#1吗?
没有。 #1更简单,与其他选项相比没有性能损失。
使用仿函数的算法只是按值通常使用它们,但如果你想保证不出于某种原因复制仿函数,那么使用通用引用是合理的。如果您正在撰写仅仅转发仿函数的内容,那么请使用通用引用。
答案 1 :(得分:1)
我实际上说#2,因为我更喜欢不同的非可变和非引用变量/仿函数,然后声明每个其他变量const auto&
。我更喜欢使用引用的原因是你不必关心函数是否返回生成的值或引用。