リファレンスに対するリファレンスは存在しない。
typedef int & & type ; // エラー
しかし、typedef、テンプレート仮引数、decltype指定子の型が、リファレンス型であった場合、さらにリファレンスの宣言子を書く事はできる。その場合、非常に奇妙なことが起こる。
typedef、テンプレート仮引数、decltype指定子の型を、Tへのリファレンス型とする。ここでいうリファレンスとは、lvalueリファレンスとrvalueリファレンスの両方を含む。もし、これらの型に対する、lvalueリファレンスを宣言しようとした場合、元の型のリファレンスの如何に関わらず、lvalueリファレンスとなる。rvalueリファレンスの場合、元の型のリファレンスになる。
int main() { typedef int & lvalue_ref ; // lvalueリファレンス typedef int && rvalue_ref ; // rvalueリファレンス // lvalueリファレンスを宣言しようとした場合 // 元のリファレンス型が、lvalueリファレンスでもrvalueリファレンスでも、lvalueリファレンスになる typedef lvalue_ref & type1 ; // int & typedef rvalue_ref & type2 ; // int & // rvalueリファレンスを宣言しようとした場合 // 元のリファレンス型になる typedef lvalue_ref && type3 ; // int & typedef rvalue_ref && type4 ; // int && }
rvalueリファレンスは無視されるという、この仕様は、std::forwardを実装する上で、非常に重要である。
No comments:
Post a Comment