• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    friend指定された関数内から構造化束縛を使用して非公開メンバ変数にアクセスすることを許可 [P0969R0]

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

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

    概要

    C++17までの構造化束縛では、publicアクセス指定されたメンバ変数のみ抽出できる仕様となっていた。

    しかし実際には、friend指定された関数からであれば、privateアクセス指定されたメンバ変数にアクセスできるため、C++20では「構造化束縛を使用する文脈でアクセス可能なメンバ変数を抽出できる」という仕様に改訂された。

    #include <iostream>
    
    struct A {
      friend void foo();
    private:
      int i = 3;
    };
    
    void foo() {
      A a;
    
      // メンバ変数iを取得する。
      // クラスAからfriend指定されているため、privateメンバ変数iにアクセスできる
      auto x = a.i; // C++17 : OK, C++20 : OK
    
      // 構造化束縛でメンバ変数を抽出する
      auto [y] = a; // C++17 : コンパイルエラー, C++20 : OK
    
      std::cout << x << std::endl;
      std::cout << y << std::endl;
    }
    
    int main() {
      foo();
    }
    

    出力

    3
    3
    

    関連項目

    参照