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

履歴 編集

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

概要

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;
}

出力

参照