为了阐明核心概念,我们将其简化为一个更基本的例子。虽然std::tie
是返回(元组)更值的函数是有用的,我们可以把它理解仅仅只用一个价值罚款:
int a;
std::tie(a) = std::make_tuple(24);
return a; // 24
的事情,我们需要知道以前进:
下一步是摆脱这些功能只有在你的方式,所以我们可以改变我们的代码是:
int a;
std::tuple<int&>{a} = std::tuple<int>{24};
return a; // 24
下一步是看到什么发生在这些结构内部。 对于这一点,我创建了2种T
取代了std::tuple<int>
和Tr
取代std::tuple<int&>
,精简到最低限度,为我们的操作:
struct T { // substituent for std::tuple<int>
int x;
};
struct Tr { // substituent for std::tuple<int&>
int& xr;
auto operator=(const T& other)
{
// std::get<I>(*this) = std::get<I>(other);
xr = other.x;
}
};
auto foo()
{
int a;
Tr{a} = T{24};
return a; // 24
}
最后,我想摆脱的结构都在一起(当然,这不是相当于100%,但对我们来说足够接近,并明确足以让它):
auto foo()
{
int a;
{ // block substituent for temporary variables
// Tr{a}
int& tr_xr = a;
// T{24}
int t_x = 24;
// = (asignement)
tr_xr = t_x;
}
return a; // 24
}
所以基本上,std::tie(a)
初始化数据成员参考a
。 std::tuple<int>(24)
创建一个值为24
的数据成员,并且该分配将24分配给第一个结构中的数据成员引用。但由于该数据成员是绑定到a
的参考,所以基本上将24
分配给a
。
如果最后一行编译我有点担心。它看起来像绑定一个非法的临时参考。 –
@NirFriedman在这种情况下你不会获得终生延期吗? – Neil
@Neil它必须是右值引用或常量左值引用。您不能将左值引用绑定到prvalue(临时)。尽管这已经是MSVC多年的“延伸”了。 –