最初: と はどこにstd::move
定義std::forward
されていますか? それらが何をするかは知っていますが、それらを含めるために標準ヘッダーが必要であるという証拠を見つけることができません。gcc44std::move
では、利用できる場合と利用できない場合があるため、明確な include ディレクティブが役立ちます。
移動セマンティクスを実装する場合、ソースはおそらく未定義の状態のままになります。この状態は、オブジェクトの有効な状態である必要がありますか? 明らかに、オブジェクトのデストラクタを呼び出すことができる必要があり、クラスが公開する手段によってオブジェクトを代入できる必要があります。しかし、他の操作は有効である必要がありますか? 私が求めているのは、クラスが特定の不変条件を保証している場合、ユーザーがそれらを気にしないと言ったときに、それらの不変条件を強制するように努力する必要があると思いますか?
次: 移動セマンティクスを気にしない場合、関数パラメーターを処理するときに右辺値参照よりも非 const 参照が優先される原因となる制限はありますか? void function(T&);
呼び出し元のvoid function(T&&);
観点からは、関数に一時的な値を渡すことができると便利な場合があるため、実行可能な場合はいつでもそのオプションを許可する必要があるようです。また、右辺値参照はそれ自体が左辺値であるため、誤ってコピー コンストラクターの代わりにムーブ コンストラクターなどを呼び出すことはできません。マイナス面は見当たりませんが、マイナス面があることは確かです。
それが私の最後の質問につながります。一時変数を非 const 参照にバインドすることはまだできません。ただし、それらを非 const 右辺値参照にバインドできます。そして、その参照を別の関数で非 const 参照として渡すことができます。
void function1(int& r) { r++; }
void function2(int&& r) { function1(r); }
int main() {
function1(5); //bad
function2(5); //good
}
何もしないという事実に加えて、そのコードに何か問題がありますか? 右辺値参照を変更することは、それらの存在の全体的なポイントであるため、私の直感はもちろんそうではありません。そして、渡された値が正当に const である場合、コンパイラはそれをキャッチして怒鳴ります。しかしどう見ても、これは何らかの理由で導入されたと思われる仕組みの回避策であるため、私が愚かなことをしていないことを確認したいと思います。