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:

Post a Comment

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.