このページは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;
}
出力