C++ reference_包装器和std::ref如何工作?

C++ reference_包装器和std::ref如何工作?,c++,c++11,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 << s

我试图理解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){
c+=1;
}
int main(){
int x{3};
标准::cout
c+=1;
如何有效


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

std::reference\u wrapper
具有to
T&
。这意味着std::reference\u wrapper可以是i在您的示例中,mplicity转换为
int&

@Sungmin:的确,
c
本身不能更改类型;但是
+=
应用于
c.operator int&()
这将是对
引用\u包装器的目标的引用。请注意,此魔法仅适用于运算符。例如,如果
x
属于类类型且具有方法
x.foo()
,并且您试图将对
x
的引用包装在
引用包装中
rx
,您不能只说
rx.foo()
。您必须说
rx.get().foo()
,它几乎和使用指针一样难看。所以不幸的是,
std::reference\u wrapper
并不是一个神奇的用于引用的do all wrapper(这就是很多人希望使用它的原因,例如)。这两个答案几乎是同时上传的。但是迈克·西摩的答案快了一点。除此之外,我无法决定选择哪一个。对此表示抱歉。无论如何谢谢。@Sungmin不客气。我认为西摩的答案更好:他解释了运算符重载和操作数,但我没有做到。