Skip to content

Latest commit

 

History

History
46 lines (31 loc) · 1.95 KB

reference_capture_of_structured_bindings.md

File metadata and controls

46 lines (31 loc) · 1.95 KB

構造化束縛した変数の参照キャプチャを許可 [P1381R1]

  • cpp20[meta cpp]

このページはC++20に採用された言語機能の変更を解説しています。

のちのC++規格でさらに変更される場合があるため関連項目を参照してください。

概要

構造化束縛した変数はラムダ式で参照キャプチャできない規定となっていたが、これを許可する。ただし、ビットフィールドを構造化束縛した変数は参照キャプチャできない。

struct X {
  int a : 1; // ビットフィールドは参照キャプチャできない
  int b;     // 非ビットフィールドは参照キャプチャできる
};

int main() {
  auto [a, b] = X{};

//auto f1 = [&] { return a; };      // C++17:NG C++20:NG
//auto f2 = [&a = a] { return a; }; // C++17:NG C++20:NG
//auto f3 = [&a] { return a; };     // C++17:NG C++20:NG

  // デフォルト参照キャプチャをした場合、ビットフィールドはキャプチャされない
  auto g1 = [&] { return b; };      // C++17:NG C++20:OK
  auto g2 = [&b = b] { return b; }; // C++17:OK C++20:OK
  auto g3 = [&b] { return b; };     // C++17:NG C++20:OK
}

仕様

  • 参照キャプチャできない要素として、ビットフィールド、構造化束縛した変数、無名共用体のメンバの3つがあったが、C++20ではこの不許可リストから「構造化束縛した変数」が削除された

参照