2016-11-20 4 views
2

私はちょうどa bit about tuplesを読んでいます。std :: tieの構文が不明確

今、次の構文は、私には明らかではない。

std::tie (myint, std::ignore, mychar) = mytuple; 

それが何をするか把握することは困難ではないのですが、何がビューの言語の観点からどうなりますか?私たちは何とか関数の戻り値に代入していますか?

答えて

5

しかし、言語の観点からはどうなりますか?私たちは何とか関数の戻り値に代入していますか?

はい、関数の戻り値の型によって有効です。主に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で何が起こっているかです。

+0

C++の 'struct'と' class'esでは、 '* this'への参照がC++ 11に現れるまで、一時的であってもいつでも割当てることができます!結果が破棄されたとしても、 'operator ='は動作します。ここで興味深い部分は、 '結び目 'に割り当てることは何か*役に立つ*ことです。 – Yakk

2

tieは、参照のタプルを返します。そのタプルに代入しています。これはタプルとメンバーワイズの代入を意味します(std::ignore個のフィールドは例外です)。そのタプルの要素は実際には参照であるため、代わりに結合要素に割り当てます。

4

std::tie(myint, std::ignore, mychar)の戻り型はint&myintへの参照であり、
std::tuple<int&, decltype((std::ignore)), char&>char&mycharへの参照です。

mytupleがこの返されたタプルオブリファレンスに割り当てられると、mytupleの各値は、返されたタプルに格納されたそれぞれのリファレンスに割り当てられます。これにより、myintmycharが更新されます。 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&; 
+0

'decltype(std :: ignore)&'(または 'decltype((std :: ignore))')です。 。 –

+0

@ T.C。 : 確かに!ありがとうございました。 – ildjarn

1

「STDの引数またはインスタンスへの左辺値参照のタプルを作成します::無視。」

その意味で、それはあなたがの戻り値に割り当てるときと大差はありません私達はちょうどそのC++ 17を言及する必要があり

vec[3]=5; 

のようにオペレータ[]バインディングauto [a,b,c] =を構造化している、とstd::ignore with structured bindings?

+0

しかし、それは基本的に '右値'への割り当てですか? (C++では禁止されていません) – Michael

+0

@Michaelネクタイのタプルは確かにrvalueです – krzaq

関連する問題