17

我试图了解 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;有效?

4

2 回答 2

20

如何c += 1;有效?

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

于 2013-05-14T11:51:53.747 回答
12

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

于 2013-05-14T11:52:12.157 回答