【发布时间】:2020-06-07 07:08:29
【问题描述】:
std::ref 给你一个lvalue-reference 的东西。此引用被包装到一个对象中,然后您可以通过引用或值传递该对象。
下面代码的预期行为是它打印i is 2,但它打印i is 1。 为什么会这样?
我为什么会有这种期望?因为我通过std::ref 将tmp 传递给wrapper。然后在包装器中按值捕获引用。我会假设,因为我使用的是std::ref,所以这个值现在仍然是对tmp 的引用。我正在更改 tmp 并希望 f 反映该更改。
#include <iostream>
#include <functional>
template<typename F>
auto wrapper(int i, F func) {
return [=]() { return func(i); };
}
void f(int i) {
std::cout << "i is " << i << '\n';
}
int main() {
int tmp = 1;
auto func = wrapper(std::ref(tmp), f);
tmp = 2;
func();
}
【问题讨论】:
-
"
std::ref给你一个lvalue-reference的东西" - 没有。它会给你std::reference_wrapper的东西。
标签: c++ reference pass-by-reference higher-order-functions pass-by-value