最終更新日時: 2025年07月10日 10時26分30秒 (JST)
Koichi Murase が更新

履歴 編集

# 構造化束縛した変数の参照キャプチャを許可 [P1381R1](C++20)

このページは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ではこの不許可リストから「構造化束縛した変数」が削除された

## 関連項目

- C++17 構造化束縛
- C++20 構造化束縛を拡張して通常の変数宣言のように使用できるようにする

## 参照

- P1381R1 Reference capture of structured bindings