構造化バインディングc++17 で導入されました。これにより、タプルまたは構造体から初期化された複数の変数を宣言できるようになります。
このコードはc++17
コンパイラを使用してコンパイルされます。
#include <iostream>
#include <tuple>
int main() {
auto tuple = std::make_tuple(1.0, 1);
auto [ d, i ] = tuple;
std::cout << "d=" << d << " i=" << i << '\n';
return 0;
}
変数を宣言しないとauto
エラーが発生します
エラー: ラムダ式の本体が必要です[d2, i2] = タプル;
#include <iostream>
#include <tuple>
int main() {
auto tuple = std::make_tuple(1.0, 2);
double d2;
int i2;
[d2 , i2] = tuple;
return 0;
}
clang version 4.0.0
コンパイルオプション を使用しました-std=c++1z
。
既存の変数を構造化バインディングに割り当てることはできますか? を使用する必要がありますかauto
?
ベストアンサー1
あなたが受け取ったエラーメッセージは、なぜそれがのみで許可されるのかをかなり示していますauto
:文法が曖昧にならないようにするさらに文脈に依存します。
式の先頭の角括弧はラムダを表します。あなたが求めているのは、標準で次のように規定することです。時々 [d2 , i2]
d2
は、値によってとをキャプチャするラムダの始まりでありi2
、別の時にそれは開梱の課題です。すべてはそれに続く内容に基づいています。
言語に複雑さを加える価値はありません。特に、あるプログラマーが指摘したように、std::tie
タプルを使用して必要な操作をすでに実行する必要があります。
それだけでなく、std::tie
構造化バインディングではまだサポートされていない、アンパックされた値の一部を無視することもできます。つまり、標準ライブラリがタプルで既に行っていることを行うために、より限定された形式の構文糖を用意することになります。
ああ、タプルでしか動作しないことに不満があるならstd::tie
、自分で拡張して任意のPODで動作するようにすることができます。これを見てくださいmagic_get
実装同じ考え方を適用して、constexpr
POD を に供給できる参照のタプルに変換できますstd::tie
。次のようになります。
std::tie(d2, i2) = magic_unpack(/*some POD that isn't a tuple*/);