reference_wrapper和std::ref是如何工作的?

How do reference_wrapper and std::ref work?

本文关键字:工作 何工作 wrapper std reference ref      更新时间:2023-10-16

我想了解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

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

c += 1;是如何有效的?

因为reference_wrapper<int>通过其转换操作符隐式地转换为int&;如果操作数类型本身没有合适的重载,则考虑对操作数进行隐式转换。

std::reference_wrapper<T>有一个到T&的转换运算符。这意味着std::reference_wrapper可以在示例中隐式转换为int&