auto指定子では、他の指定子や宣言子を組み合わせることができる。
int x = 0 ; int & ref = x ;
ここで、宣言子がrvalueリファレンスの場合、注意を要する。
int main()
{
int x = 0 ;
int && r1 = x ; // エラー、rvalueリファレンスをlvalueで初期化できない
auto && r2 = x ; // OK、ただし、r2の型はint &
auto && r3 = std::move(x) ; // OK、r3の型はint &&
// false
std::is_rvalue_reference< decltype(r2) >::value ;
// true
std::is_rvalue_reference< decltype(r3) >::value ;
}
なぜならば、auto指定子の型は、template argument deductionと同じルールで決定されるからである。
template < typename U >
void f( U && u ) { }
int main()
{
int x = 0 ;
f( x ) ; // Uはint &
f( std::move(x) ) ; // Uはint &&
}
これは気がついてよかった。参考書にも書いておかなければ。
No comments:
Post a Comment