我对这个程序有一些疑问:
#include <iostream>
#include <type_traits>
#include <functional>
using namespace std;
template <typename T> void foo ( T x )
{
auto r=ref(x);
cout<<boolalpha;
cout<<is_same<T&,decltype(r)>::value;
}
int main()
{
int x=5;
foo (x);
return 0;
}
输出是:
false
我想知道,如果 std::ref
不返回对象的引用,那它有什么作用呢?基本上,有什么区别:
T x;
auto r = ref(x);
和
T x;
T &y = x;
另外,我想知道为什么存在这种差异?为什么我们需要 std::ref
或 std::reference_wrapper
当我们有引用时(即 T&
)?
原文由 DevInd 发布,翻译遵循 CC BY-SA 4.0 许可协议
那么
ref
构造一个适当的reference_wrapper
类型的对象来保存对对象的引用。这意味着当您申请时:这将返回
reference_wrapper
而不是对x
的直接引用(即T&
)。这reference_wrapper
(即r
)改为持有T&
。reference_wrapper
当你想模拟一个可以复制的对象的reference
时非常有用(它既是可 复制的 又是 _可复制的_)。In C++, once you create a reference (say
y
) to an object (sayx
), theny
andx
share the相同的 _基地址_。此外,y
不能引用任何其他对象。您也不能创建 引用数组, 即这样的代码会引发错误:但是这是合法的:
用
cout << is_same<T&,decltype(r)>::value;
谈论您的问题,解决方案是:让我给你看一个程序:
看到这里,我们了解了三件事:
reference_wrapper
对象(此处为r
)可用于创建 引用数组, 这是T&
无法实现的。r
实际上就像一个真实的参考(看看r.get()=70
如何改变了y
的值)。r
与T&
但r.get()
。这意味着r
持有T&
即顾名思义是 对引用T&
的包装。我希望这个答案足以解释您的疑问。