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

履歴 編集

friend宣言できる対象を拡張 [N1791](C++11)

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

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

概要

C++03までのfriend宣言は、直接のクラス型のみを指定できた。

C++11ではfriend宣言が拡張され、テンプレートパラメータ、および型の別名もまたfriend宣言できるようになった。

仕様

friend宣言の構文が、以下のように拡張された:

friend elaborated-type-specifier ;
friend simple-type-specifier ;     // 追加
friend typename-specifier ;        // 追加

  • elaborated-type-specifierは、従来のfriend宣言できる型。クラス名、およびクラスの入れ子型を指定できる
  • simple-type-specifierは、テンプレートパラメータの型を含む、intcharautovoid、列挙型、型の別名などを表す識別子
  • typename-specifierは、typenameキーワードを使用した、テンプレートパラメータに依存した入れ子型
  • friend宣言に対して非クラス型が指定された場合、その宣言は無視される
  • friend宣言に指定された型のCV修飾は無視される

template <class Derived>
class base {
  // 派生クラスから、baseクラスのprivate機能にアクセスできるようにする
  friend Derived;

  // privateなデフォルトコンストラクタ
  base() {}
};

class derived : public base<derived> {
};

int main()
{
  derived d;
}

出力

参照