簡體   English   中英

傳遞轉發引用作為拉姆達捕獲

[英]Passing forwarding reference as lambda capture

考慮以下代碼:

template <typename C>
void boo (C&& c) {
    c ();
}

template <typename T>
void foo (T&& v) { // (X)
    boo ([&v] () { some_func (std::forward<T> (v)); }); // (Y)
}

至於我擔心v(X)是一個轉發的參考。 v也轉發引用(Y)如果它被引用捕捉? 或者我應該把它寫不同采取轉發的優勢?

至於我擔心v(X)是一個轉發的參考。

正確的。


v也轉發引用(Y)如果它被引用捕捉?

不, v拉姆達的體內是指匿名閉包實例的成員變量v

some_func (std::forward<T> (v));

作為

some_func (std::forward<T> (this_closure->v));

無論如何,您使用std::forward這里是正確的-它會傳播臨時性如果v傳遞給foo是右值。

這是因為std::forward<X>(x)執行此操作:

  • 如果X是一個值類型或一個rvalue引用類型,它施放xX&&

  • 如果X是一個左值引用類型,它施放xX&

v拉姆達體內始終是一個左值,但std::forward<T>取決於原始類型傳遞給的類型foo

如果您是確保拉姆達將再次在相同的調用堆棧的調用foo調用,它是安全的捕獲參考,並且forward在體內。

否則,你可能要“以完善的轉發捕獲”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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