このページはC++11に採用された言語機能の変更を解説しています。
のちのC++規格でさらに変更される場合があるため関連項目を参照してください。
概要
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;
}
9
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;
}