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

履歴 編集

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

概要

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

関連項目

参照