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
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.