2022年4月21日木曜日

Moveの動作

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 件のコメント:

コメントを投稿