好ref
构造一个适当reference_wrapper
类型的对象,以保存对对象的引用。这意味着您申请时:
auto r = ref(x);
这将返回areference_wrapper
而不是直接引用x
(例如T&
)。这个reference_wrapper
(即r
)成立T&
。
一reference_wrapper
,当你想模仿是非常有用的reference
,可复制的对象(它既是拷贝构造和拷贝分配)。
在C ++中,一旦创建参考(比方说y
)一个对象(比如x
),然后y
与x
共享相同的基地址。此外,y
不能引用任何其他对象。另外,您不能创建引用数组,即像这样的代码将引发错误:
#include <iostream>
using namespace std;
int main()
{
int x=5, y=7, z=8;
int& arr[] {x,y,z};
return 0;
}
但这是合法的:
#include <iostream>
#include <functional> // for reference_wrapper
using namespace std;
int main()
{
int x=5, y=7, z=8;
reference_wrapper<int> arr[] {x,y,z};
for (auto a: arr)
cout << a << " ";
return 0;
}
谈到您的问题cout << is_same<T&,decltype(r)>::value;
,解决方案是:
cout << is_same<T&,decltype(r.get())>::value;
让我给你看一个程序:
#include <iostream>
#include <type_traits>
#include <functional>
using namespace std;
int main()
{
cout << boolalpha;
int x=5, y=7;
reference_wrapper<int> r=x;
cout << is_same<int&, decltype(r.get())>::value << "\n";
cout << (&x==&r.get()) << "\n";
r=y;
cout << (&y==&r.get()) << "\n";
r.get()=70;
cout << y;
return 0;
}
看到这里,我们了解三件事:
甲reference_wrapper
对象(这里r
)可被用于创建引用的数组这是不可能的T&
。
r
实际上就像一个真实的参考一样(请参阅如何r.get()=70
更改的值y
)。
r
不一样的T&
,但是r.get()
是。这意味着,r
拥有T&
即顾名思义是围绕基准包装 T&
。
我希望这个答案足以解释您的疑问。