2010-08-28

リファレンスに対するリファレンス

リファレンスに対するリファレンスは存在しない。

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: