reference_wrapper和std :: ref如何工作?

时间:2013-05-14 11:48:34

标签: 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

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

2 个答案:

答案 0 :(得分:18)

  

c += 1;如何有效?

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

答案 1 :(得分:12)

std::reference_wrapper<T>有一个conversion operatorT&。这意味着在您的示例中,std :: reference_wrapper可以隐式转换为int&