私はちょうどa bit about tuplesを読んでいます。std :: tieの構文が不明確
今、次の構文は、私には明らかではない。
std::tie (myint, std::ignore, mychar) = mytuple;
それが何をするか把握することは困難ではないのですが、何がビューの言語の観点からどうなりますか?私たちは何とか関数の戻り値に代入していますか?
私はちょうどa bit about tuplesを読んでいます。std :: tieの構文が不明確
今、次の構文は、私には明らかではない。
std::tie (myint, std::ignore, mychar) = mytuple;
それが何をするか把握することは困難ではないのですが、何がビューの言語の観点からどうなりますか?私たちは何とか関数の戻り値に代入していますか?
しかし、言語の観点からはどうなりますか?私たちは何とか関数の戻り値に代入していますか?
はい、関数の戻り値の型によって有効です。主に2つの方法があります:まず、関数は左辺値の参照をオブジェクトに返すことがあります。
int i;
int &f() { return i; }
int main() { f() = 1; } // okay, assigns to i
第二に、機能は、右辺値で呼び出すことができる=
オペレータ実装とユーザ定義の型を返すことができる:
struct S { void operator=(int) { } };
S f() { return {}; }
int main() { f() = 1; } // okay, calls S::operator=
後者はstd::tie
で何が起こっているかです。
tie
は、参照のタプルを返します。そのタプルに代入しています。これはタプルとメンバーワイズの代入を意味します(std::ignore
個のフィールドは例外です)。そのタプルの要素は実際には参照であるため、代わりに結合要素に割り当てます。
std::tie(myint, std::ignore, mychar)
の戻り型はint&
がmyint
への参照であり、
std::tuple<int&, decltype((std::ignore)), char&>
とchar&
はmychar
への参照です。
mytuple
がこの返されたタプルオブリファレンスに割り当てられると、mytuple
の各値は、返されたタプルに格納されたそれぞれのリファレンスに割り当てられます。これにより、myint
とmychar
が更新されます。 cppの参照から
std::tie(myint, std::ignore, mychar) // <-- expression
std::tuple<int&, decltype((std::ignore)), char&> // <-- type
std::tie(myint, std::ignore, mychar) = mytuple;
std::tuple<int&, decltype((std::ignore)), char&> = std::tuple<int, T, char>&;
// functions as
std::tuple<int , T , char >&
// ↓↓ = = = ↓↓
std::tuple<int&, decltype((std::ignore)), char&>
// end result:
myint = std::get<0>(mytuple);
mychar = std::get<2>(mytuple);
int& = int&;
char& = char&;
'decltype(std :: ignore)&'(または 'decltype((std :: ignore))')です。 。 –
@ T.C。 : 確かに!ありがとうございました。 – ildjarn
「STDの引数またはインスタンスへの左辺値参照のタプルを作成します::無視。」
その意味で、それはあなたがの戻り値に割り当てるときと大差はありません私達はちょうどそのC++ 17を言及する必要があり
vec[3]=5;
のようにオペレータ[]バインディングauto [a,b,c] =
を構造化している、とstd::ignore with structured bindings?
C++の 'struct'と' class'esでは、 '* this'への参照がC++ 11に現れるまで、一時的であってもいつでも割当てることができます!結果が破棄されたとしても、 'operator ='は動作します。ここで興味深い部分は、 '結び目 'に割り当てることは何か*役に立つ*ことです。 – Yakk