web-dev-qa-db-ja.com

なぜC ++ 17構造化バインディングは{}を使用しないのですか?

* C++構造化バインディングの元の提案を見つけました here 。複数の戻り値を簡単にバインドする方法を提案します、すなわち:

auto {a, b} = minmax(data);

しかし、今では誰もがC++ 17/C++ 1z提案構文を指していることがわかります

auto [a, b] = minmax(data);

「リストは{のように、この}で記述されている」とわかったので、新しいリスト構文がありますか?どうして?ここで中括弧の問題は何ですか?

51
towi

これはまだ議論中です。 []と{}の用途がすでにいくつあるかを考えると、どの構文の混乱が最も少ないかを確認することは困難です。

また、「最もわかりにくい」と「解析が最も簡単」が競合するリスクもあります。

21

@SebastianWahlはリンクのみでコメントしました。リンクの背後にあるコンテンツを簡単に要約します。

この質問に対するチャンドラー・カラスの答え:youtu.be/430o2HMODj4?t=15m50s

auto [a,b,c] = f();

autoで問題ありません。しかし、これもできます:

Tuple<int,float,string> [a,b,c] = f();

したがって、{...}これは

Tuple<int,float,string> {a,b,c} = f();  //<<< not C++17

これはbadです。なぜなら、ピースTuple<int,float,string> {a,b,c}はC++でも意味を持つため、解決が困難であいまいなものになります。

13
towi

{}から[]への変更は、ジャクソンビルの後に起こり、その会議からのコメントに応じて行われました。これは p0144r2 で詳しく説明されており、「同じタイプの複数の変数を宣言するための既存の構文と視覚的に異なるため」と述べています。

元の{}の使用法の変更を要求するNBコメントは、2016年11月の会議でコンセンサスを増やさなかったようで、[]の使用法はそのままです。少なくともSpring会議まで。

10
Mikel F

角括弧の構文について言わなければならないことの1つは、ラムダキャプチャ句によく似ているということです。同様に、autoが暗黙指定されているため、変数タイプを指定しません。つまり.

auto func = [a, b] {}
auto func = [a=1, b=2.0] {}

まったく同じものではないことは明らかですが、「コンテキストを理解して自動キャプチャするための構文」と考えると機能します。

auto [a, b] = std::make_pair(1, 2.0);
3
Yam Marcovic