簡體   English   中英

就常量性和引用性而言,函數應如何接受* lambda *參數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM