C++ reference_包装器和std::ref如何工作?
我试图理解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
#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
具有toT&
。这意味着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不客气。我认为西摩的答案更好:他解释了运算符重载和操作数,但我没有做到。