[英]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引用類型,它施放x
到X&&
。
如果X
是一個左值引用類型,它施放x
至X&
v
拉姆達體內始終是一個左值,但std::forward<T>
取決於原始類型傳遞給的類型foo
。
如果您是確保拉姆達將再次在相同的調用堆棧的調用foo
調用,它是安全的捕獲參考,並且forward
在體內。
否則,你可能要“以完善的轉發捕獲” 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.