爲了闡明核心概念,我們將其簡化爲一個更基本的例子。雖然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多年的「延伸」了。 –