Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我的std::ref不能按预期工作?_C++_Reference_Pass By Reference_Higher Order Functions_Pass By Value - Fatal编程技术网

C++ 为什么我的std::ref不能按预期工作?

C++ 为什么我的std::ref不能按预期工作?,c++,reference,pass-by-reference,higher-order-functions,pass-by-value,C++,Reference,Pass By Reference,Higher Order Functions,Pass By Value,ref为您提供对某事物的左值引用。该引用被包装到一个对象中,然后可以通过引用或值传递该对象 下面代码的预期行为是打印i为2,但打印i为1。为什么呢 为什么我会有这样的期望?因为我通过std::ref将tmp传递给包装器。在包装器中,引用由值捕获。我假设,因为我使用的是std::ref,所以这个值现在仍然是对tmp的引用。我正在改变tmp,希望f能反映出这种改变 您需要更改函数签名以接受引用: 自动包装器int&i,F func{…} 无效fint&i{…} 并通过引用return[&]{retu

ref为您提供对某事物的左值引用。该引用被包装到一个对象中,然后可以通过引用或值传递该对象

下面代码的预期行为是打印i为2,但打印i为1。为什么呢

为什么我会有这样的期望?因为我通过std::ref将tmp传递给包装器。在包装器中,引用由值捕获。我假设,因为我使用的是std::ref,所以这个值现在仍然是对tmp的引用。我正在改变tmp,希望f能反映出这种改变


您需要更改函数签名以接受引用:

自动包装器int&i,F func{…} 无效fint&i{…} 并通过引用return[&]{return funci;};进行lambda捕获;。那么您就不需要std::ref

完整代码如下所示:

包括 包括 样板 自动包装器int&i,F func{ return[&]{return funci;}; } 虚空芬特酒店{
std::cout您需要更改函数签名以接受引用:

自动包装器int&i,F func{…} 无效fint&i{…} 并且还通过引用return[&]{return funci;};进行lambda捕获

完整代码如下所示:

包括 包括 样板 自动包装器int&i,F func{ return[&]{return funci;}; } 虚空芬特酒店{
std::cout这不起作用的原因是包装器函数将int作为参数

std::ref返回std::reference\u包装。 当您将其传递给需要int的函数时 您将获得隐式转换,并且不再使用引用

如果将函数签名更改为使用std::reference_包装,它将给出预期的结果

#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();
}

这不起作用的原因是包装器函数将int作为参数

std::ref返回std::reference\u包装。 当您将其传递给需要int的函数时 您将获得隐式转换,并且不再使用引用

如果将函数签名更改为使用std::reference_包装,它将给出预期的结果

#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();
}

std::ref为您提供对某物的左值引用-不。它为您提供对某物的std::reference\u包装。std::ref为您提供对某物的左值引用-不。它为您提供对某物的std::reference\u包装。好吧……但是为什么std::ref不为我这样做呢?我认为它的一个要点是对某物进行引用,即使在我经过时也是如此通过value@User12547645因为您的函数不接受引用或std::reference\u包装。它们接受副本。好吧……但是为什么std::ref不为我这样做呢?我认为它的一个要点是即使在我路过的时候也要引用某些东西value@User12547645因为您的函数不接受引用或std::referece_包装。他们接受副本。现在这很有意义!我不知道引用包装到int的隐式转换。但是,是的,听起来合乎逻辑。谢谢!现在这很有意义!我不知道引用包装到int的隐式转换。但是,是的,听起来合乎逻辑。谢谢!
#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();
}