2016-10-26 6 views
7

C++ 11では、std :: tieで暗黙の変換が許可されていますか?std :: tieで暗黙の変換が許可されていますか?

次のコードはコンパイルされて実行されますが、舞台裏で何が起こっているのか、これが安全であるかはわかりません。何が起こる

std::tuple<float,float> foo() { return std::make_tuple(0,0); } 

double a, b; 
std::tie(a,b) = foo(); // a and b are doubles but foo() returns floats 

答えて

14

は、タプルの動き-代入演算子のテンプレートバージョンは、独自の動き割り当てのセマンティクスを使用して、個々のタプルメンバー一つずつ動きは、割り当て

template< class... UTypes > 
tuple& operator=(tuple<UTypes...>&& other); 

を使用されています。対応するメンバーが暗黙的に変換可能な場合、暗黙的に変換されます。

これは基本的にはstd::pairの類似の機能の自然な拡張です。私たちはこれまでずっと楽しんできました。

+0

おそらく、 'UTypes ... 'の引数の減算中に暗黙の変換が無視されるため、暗黙の変換は' operator = 'の本体の内部で行われることに言及することをお勧めします。 – TemplateRex

関連する問題