class T
{
public :
T( void ) { mLogV( L"Constructor") ; }
T( const T & o ) { mLogV( L"Copy Constructor") ; }
T( T && o ) { mLogV( L"Move Constructor") ; }
T & operator = ( const T & o ) { mLogV( L"Copy Operator") ; return *this ; }
T & operator = ( T && o ) { mLogV( L"Move Operator") ; return *this ; }
static
T Func1( tV ) { T o ; return o ; } // Make系関数 自動でmove扱いになる
T Func2( tV ) { return *this ; } // コピー
T & Func3( tV ) { return *this ; } // 参照 呼び出し元でstd::moveにすると、move扱いに。
// T && FuncX( tV ) { return *this ; } // コンパイルエラー
T && Func4( tV ) { return std::move( *this ) ; } // move
// T && FuncX( tV ) { T o ; return o ; } // コンパイルエラー
T && Func5( tV ) { T o ; return std::move( o ) ; } // move Func1の強制版。通常ここまでやる必要なし
static
T Func6( T o ) { return o ; } // 引数は渡し方により、copy、moveを操作可能 returnはmove
static
T Func7( T & o ) { return o ; } // 引数は参照 returnはcopy
static
T Func8( T && o ) { return o ; } // 引数はmove returnはmove
} ;
T o ; // Constructor
T o1 = o ; // Copy Constructor
T o2 = std::move( o ) ; // Move Constructor
T o3 = o.Func1() ; // Constructor - Move Constructor
T o4 = o.Func2() ; // Copy Constructor
T o5 = o.Func3() ; // Copy Constructor
T o6 = std::move( o.Func3()) ; // Move Constructor
T o7 = o.Func4() ; // Move Constructor
T o8 = o.Func5() ; // Constructor - Move Constructor
o = o1; // Copy Operator
o1 = std::move( o ); // Move Operator
o3 = o.Func1() ; // Constructor - Move Constructor - Move Operator
o4 = o.Func2() ; // Copy Constructor - Move Operator
o5 = o.Func3() ; // Copy Operator
o6 = std::move( o.Func3()) ; // Move Operator
o7 = o.Func4() ; // Move Operator
o8 = o.Func5() ; // Constructor - Move Operator
o = T::Func6( o ) ; // Copy Constructor - Move Constructor - Move Operator
o = T::Func6( std::move( o )) ; // Move Constructor - Move Constructor - Move Operator
o = T::Func6( T()) ; // Constructor - Move Constructor - Move Operator
o = T::Func7( o ) ; // Copy Constructor - Move Operator
// o = T::Func7( std::move( o )) ; // コンパイルエラー
// o = T::Func7( T()) ; // コンパイルエラー
// o = T::Func8( o ) ; // コンパイルエラー
o = T::Func8( std::move( o )) ; // Move Constructor - Move Operator
o = T::Func8( T()) ; // Constructor - Move Constructor - Move Operator
0 件のコメント:
コメントを投稿