[解決済み] 構造化バインディングで宣言された変数でラムダの暗黙のキャプチャに失敗する
質問
以下のコードで、コンパイルエラーが発生します。
C2065 'a': undeclared identifier
(と表示されます(visual studio 2017使用)。
[] {
auto [a, b] = [] {return std::make_tuple(1, 2); }();
auto r = [&] {return a; }(); //error C2065
}();
しかし、以下のコードはコンパイルされます。
[] {
int a, b;
std::tie(a, b) = [] {return std::make_tuple(1, 2); }();
auto r = [&] {return a; }();
}();
この2つのサンプルは同じものだと思っていました。コンパイラのバグでしょうか、それとも何か見逃しているのでしょうか?
どのように解決するのですか?
コア問題2313 は、構造化されたバインディングが決して変数名ではなく、決して捕捉できないように標準を変更しました。
P0588R1 のラムダ キャプチャの表現の再定式化により、この禁止が明示されました。
<ブロッククオートラムダ式[...]が構造化されたバインディングを(明示的または暗黙的に)捕捉している場合,プログラムは不正確である。 または暗黙のうちに)、プログラムは不正な形式です。
この文言は、委員会がそのようなキャプチャがどのように機能すべきかを正確に把握する間のプレースホルダであると思われることに注意してください。
歴史的な理由により、以前の回答は保存されています。
これは技術的にはコンパイルできるはずですが、ここに標準のバグがあります。
標準では、ラムダは変数だけを捕らえることができると言っています。そして、タプルのようでない構造化バインディング宣言は変数を導入しないと言っています。それは名前を導入しますが、それらの名前は変数の名前ではありません。
一方、タプルライクな構造化バインディング宣言は。
を行います。
は変数を導入します。
a
と
b
で
auto [a, b] = std::make_tuple(1, 2);
は実際の
参照型変数です。ですから、ラムダで捕捉することができます。
明らかにこれは正気の状態ではなく、委員会はこれを知っているので、修正が来るはずです(ただし、構造化バインディングをどのようにキャプチャするかについては、正確にいくつかの不一致があるようです)。
関連
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】C++の余分な資格エラー
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み】'std::cout'への未定義の参照
-
[解決済み] M_PIはmath.hで動作するが、Visual Studioのcmathでは動作しない。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】Enterキーを押して続行する
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)