我正在尝试std::reference_wrapper
以下代码段
int a = 42, b = 52;
std::tuple<std::reference_wrapper<int>> t = std::make_tuple(std::ref(a));
std::get<0>(t) = b;
std::cout << "t[0] = " << std::get<0>(t) << ", a = " << a << ", b = " << b
<< std::endl;
输出为t[0] = 52, a = 42, b = 52
,这并不奇怪。
但是,如果我只使用auto
for t
,即
int a = 42, b = 52;
auto t = std::make_tuple(std::ref(a));
std::get<0>(t) = b;
std::cout << "t[0] = " << std::get<0>(t) << ", a = " << a << ", b = " << b
<< std::endl;
然后我得到了 t[0] = 52, a = 52, b = 52
看起来类型变成了int&
。然后我有一些问题:
std::ref
给我们std::reference_wrapper
而不是&
?&
以及为何与情况有所不同std::reference_wrapper
。std::reference_wrapper
,std::get<0>(t) = 52;
无法编译。(尽管如此&
)。错误是“调用类'std :: __ 1 :: reference_wrapper'的私有构造函数”。有人可以详细解释吗?谢谢!!
- 我认为std :: ref给了我们std :: reference_wrapper而不是&?
这不是问题,但您的想法正确。
- 我应如何解释&的情况以及为什么它与std :: reference_wrapper不同。
当std::reference_wrapper
参数传递给时std::make_tuple
,生成的元组将具有引用成员而不是引用包装器。
行为上的差异是因为分配引用时,您修改了引用的对象,而分配引用包装器时,而是重新绑定了包装器以引用另一个对象,并且不修改引用的对象。
我还注意到,在std :: reference_wrapper的情况下,std :: get <0>(t)= 52; 不编译。(虽然&确实如此)。错误是“调用类'std :: __ 1 :: reference_wrapper'的私有构造函数”。有人可以详细解释吗?
std::reference_wrapper
没有针对引用类型的赋值运算符。它仅具有另一个引用包装程序的赋值运算符。std::reference_wrapper
有一个隐式转换的构造函数,它接受一个左值,但没有一个接受右值。
这就是为什么您可以分配b
哪个是左值,而不能分配52一个右值。这是一件好事,因为参考包装器无法延长临时对象的寿命。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句