reference_wrapper和std :: ref如何工作?

Sun*_*min 17 c++ c++11

我试图了解std :: ref的工作原理.

#include <functional>
#include <iostream>

template <class C>
void func(C c){
    c += 1;
}

int main(){
    int x{3};
    std::cout << x << std::endl;
    func(x);
    std::cout << x << std::endl;
    func(std::ref(x));
    std::cout << x << std::endl;
}

Output : 3 3 4
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我认为C第三个函数调用的模板参数被实例化为std::reference_wrapper<int>.在阅读参考文献时,我注意到没有+=操作员std::reference_wrapper<int>.那么,如何c += 1;有效?

Mik*_*our 18

怎么c += 1;有效?

因为reference_wrapper<int>可以int&通过其转换运算符隐式转换为; 如果操作数类型本身没有合适的重载,则考虑操作数的隐式转换.


jua*_*nza 12

std::reference_wrapper<T>有一个转换操作符T&.这意味着std :: reference_wrapper可以int&在您的示例中隐式转换为.