クラスコードによって異なります。クラスに右辺値参照コンストラクターと代入演算子がない場合、std::moveは無視されます。std :: moveは何も移動せず、適切な関数が使用可能な場合は、引数を右辺値参照として扱うことができます。
正しく記述された&&コンストラクターとoperator=は、パラメーターインスタンスを空の文字列などの一貫した状態のままにする必要があり、オブジェクトは使用可能である必要があります。operator =がある場合、別のオブジェクトがそのような空のインスタンスに正しく割り当てられている可能性があります。
編集。
一般に、std :: moveは、右辺値ではない変数に移動セマンティクスを適用するために使用する必要がありますが、実際には次のようになります。
SomeClass :: SomeClass(SomeClass && v)
{{
//この関数の内部では、vはもはや右辺値ではありません。しかし、私は実際にそれを知っています
//これは右辺値であり、std::moveを使用します
OtherFunction(std :: move(v));
}
この場合、vの最小要件は、問題なく死ぬことができるはずであるということです。
std :: moveが実際には右辺値参照ではない変数に使用される場合、実際には、この変数のユーザビリティは未定義である可能性があります。私自身のクラスでは、この場合に何らかの一貫性を確保します。別のクラスの場合-特定のクラスの実装に依存しますが、実際には右辺値参照ではないオブジェクトにstd::moveを適用しません。これが標準でどのように定義されているか(そして定義されているかどうか)は本当にわかりません。