gpt4 book ai didi

c++ - 将转发引用作为 lambda 捕获传递

转载 作者:太空狗 更新时间:2023-10-29 20:34:40 24 4
gpt4 key购买 nike

考虑以下代码:

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)
}

就我而言,(X) 中的v 是转发引用。如果 v 是通过引用捕获的,它是否也是 (Y) 中的转发引用?或者我应该以不同的方式编写它以利用转发?

最佳答案

As far as I am concerned v in (X) is a forwarding reference.

正确。


Is v also a forwarding reference in (Y) if it was captured by reference?

不,v在 lambda 主体内部引用匿名闭包实例的成员变量 v .阅读

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

作为

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

无论如何,您对 std::forward 的使用这是正确的 - 如果 v 它将传播临时性传递给 foo是一个右值。

这是因为 std::forward<X>(x)这样做:

  • 如果 X是值类型或右值引用类型,它转换为 xX&& .

  • 如果 X是左值引用类型,它强制转换 xX& .

v在 lambda 体内总是一个左值,但是 std::forward<T>取决于传递给 foo 的原始类型的类型.

如果您确定 lambda 将在与 foo 相同的调用堆栈中被调用一次调用,通过引用和 forward 捕获是安全的在体内。

否则,您可能想要 "capture by perfect-forwarding" .

关于c++ - 将转发引用作为 lambda 捕获传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47100177/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com