最終更新日時:
が更新

履歴 編集

参照への参照を折りたたむ(C++11)

概要

C++03までは、T&型に左辺値参照を足すと、「参照への参照 (reference to reference)」となってしまいコンパイルエラーとなっていた。

C++11では、型の別名定義、テンプレートパラメータ、およびdecltypeの文脈において、T&型に左辺値参照を足してもT&型となることが規定された。これを「reference collapsing (参照を折りたたむ)」という。

基本例

int main()
{
  typedef int& ir;

  // C++03ではint& &となりコンパイルエラー
  // C++11ではint&となりOK
  typedef ir& irr;
}

回避策が不要になった例

// 型Tを参照型にするメタ関数
template <class T>
struct add_lvalue_reference {
  typedef T& type;
};

// C++03では、参照への参照にならないように、この部分特殊化が必要
// C++11ではこの部分特殊化は必要ない (あっても問題はない)
template <class T>
struct add_lvalue_reference<T&> {
  typedef T& type;
};

int main()
{
  typedef add_lvalue_reference<int>::type ir;
  typedef add_lvalue_reference<int&>::type irr;
}

参照