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

履歴 編集

# 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`は、テンプレートパラメータの型を含む、`int`、`char`、`auto`、`void`、列挙型、型の別名などを表す識別子
- `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;
    }

### 出力

## 参照

- N1520 Extended friend Declarations
- N1616 Extended friend Declarations (Rev. 1)
- N1722 Extended friend Declarations (Rev. 2)
- N1791 Extended friend Declarations (Rev. 3)