[英]How should a function accept a *lambda* parameter, in terms of constness and referenceness?
以下各項的行為有何不同?
我不清楚const
對函數參數有什么影響,在這種情況下按值,按引用或按右值引用傳遞之間會有什么區別。
請注意,我了解按值傳遞和按引用傳遞之間的區別。 不過,在std :: function或更具體地是lambda的特定情況下,我不確定通過值傳遞lambda與通過引用傳遞lambda是做什么的。 按值傳遞lambda是什么意思? 將復制什么數據?
const
和lambda之間是否也有實際區別?
#include <functional>
void foo_with_func( std::function<void()> f) { ...; f(); ...; }
void foo_with_func( std::function<void()>& f) { ...; f(); ...; }
void foo_with_func( std::function<void()>&& f) { ...; f(); ...; }
void foo_with_func(const std::function<void()> f) { ...; f(); ...; }
void foo_with_func(const std::function<void()>& f) { ...; f(); ...; }
void foo_with_func(const std::function<void()>&& f) { ...; f(); ...; }
都具有相同的用法:
foo_with_func([&]() { ... });
給定建議的用法foo_with_func([&]() { ... });
,
void foo_with_func( std::function<void()>& f) { ...; f(); ...; }
將不會編譯,因為它將非常量左值引用綁定到臨時表。 其余的等效於任何合適的優化編譯器。 如果您還想使用std::function<void()> func;
來調用它std::function<void()> func;
,則通過傳遞const lvalue引用可能比按值傳遞更有效。
但是,它們都不是最有效的,因為所有類型都會產生擦除成本。 為了避免這些費用,請編寫模板並直接接受lambda。
template<class F>
void foo_with_func(F f){ f(); }
如果lambda按值捕獲並且復制可能很昂貴,則也可以使用F&&
。
常數參數
普通的舊數據類型(例如double, int,
和char
應按值(副本)傳遞。 它們適合處理器寄存器,並且任何其他機制也可能需要更多處理或內存。
較大的數據結構應通過常量引用傳遞。 將較大的結構復制到堆棧上會占用大量內存,並且需要額外的處理。 傳遞引用意味着您正在引用現有項目。 傳遞常量引用意味着該函數將不會更改引用的項目。
可變參數
將由函數修改的參數應通過引用傳遞。 這使您的程序可以修改項目“就地”。
注意: 我還沒有玩過移動語義,所以我不建議您是否使用移動語義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.