コアの概念を明確にするために、より基本的な例にしましょう。我々は前進するために知っておく必要があり
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
次のステップは、正確に何を参照することですそれらの構造の中で起こる。このため 、私たちの事業のために最低限まで剥奪std::tuple<int>
とTr
置換基std::tuple<int&>
のための2種類のT
置換基、作成:
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
@ニールルこれは、値の参照または定数の左辺の参照のいずれかである必要があります。左辺値の参照を仮値にバインドすることはできません(一時的)。これは、年齢のMSVCの "拡張"されていますが。 –