为什么我的 std::ref 无法按预期工作?
Why does my std::ref not work as expected?
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();
}
这不起作用的原因是您的wrapper
函数将int
作为参数。
std::ref
返回一个std::reference_wrapper
。 当您将其传递给需要int
的函数时 您将获得隐式转换,并且不再使用引用。
如果您将函数签名更改为使用std::reference_wrapper
它将给出预期的结果。
#include <iostream>
#include <functional>
template<typename F>
auto wrapper(std::reference_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();
}
您需要更改函数签名以接受引用:
auto wrapper(int& i, F func) {...}
void f(int& i) {...}
并且还通过引用return [&]() { return func(i); };
进行 lambda 捕获。那么你不需要std::ref
.
完整代码如下所示:
#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(tmp, f);
tmp = 2;
func();
}
现在上面的代码将打印:
i is 2
如果您仍想使用std::ref
,那么您的模板函数应具有以下签名:
template<typename F>
auto wrapper(std::reference_wrapper<int> i, F func) {...}
相关文章:
- 为什么我的 std::ref 无法按预期工作?
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 我的评分程序无法正常工作
- 如何使我的 sizeof sum 结构与空参数包一起工作
- 编译在我的 Mac 上工作,但在集群 (Linux) 上不起作用
- #if 如何工作?我误解了 #if~#endif 的形式吗?
- 如何使实例化在我的 OpenGL 程序中工作?
- 我的文件无法正常工作,无法从C++文件中读取上下文
- 我的代码无法正常工作。谁能指出错误?
- 我的 SDL2 程序需要哪些二进制文件,以便它在另一台未安装 SDL2 的计算机中工作
- 代码在 CodeSignal 中工作不正确。不确定这是否是我的代码缺陷
- cout 在我的程序上无法正常工作,有人可以帮助我吗?
- 为什么我的 while 循环对于特定输入中断,而对于其他输入工作正常?
- 为什么我的模运算符无法正常工作?
- 我无法让我的程序工作,我一直得到未定义的符号:C
- 在矩阵逆变器上工作,由于某种原因,我的指数循环不起作用
- 为什么我的类工作正常,即使在返回垃圾值作为赋值运算符和空复制构造函数的返回之后
- 我的随机生成器是否不工作,或者我决定人/骨架是否击中对手的方式是否有错误
- 我的C++程序的工作目录是什么
- 为什么这段代码不能正常工作???我的意思是,为什么当我运行它时它没有显示任何内容?