1

C++ で移動セマンティクスを理解して使用するのに苦労しています。Variable移動コンストラクターと移動代入を実装するオブジェクトがありますが、コピー コンストラクターと代入はありません。一般に a をコピーしVariableても意味がないので、コピーを明示的に禁止したいと思います。

class Variable {
public:
    // ctod/dtor things
    Variable(Variable&&);
    Variable& operator =(Variable&&);
    // ...
};

Variable問題は、関数から aを返す正しい方法は何ですか?

Variable& UserObject::giveMeYourVariable() {
    // Calculate parameters
    Variable v(/* Some parameters */);
    return v; // <=== warning: reference to local variable 'v' returned
}

別のコードでは:

UserObject x* = new UserObject;
Variable v = std::move(x->giveMeYourVariable())

上記のコードはエラーなしでコンパイルされますが、ローカル変数への参照を返すことに関する警告が表示されます。このコードはメモリ リークを起こしたり、未定義の動作を引き起こしたり、削除された参照を返したりしますか? 何が間違っていますか?

値による戻り値を更新
すると、参照型の初期化中にエラーが発生します (パーサー ジェネレーターによって生成されたコード内)。

Variable& tmp (this->a_function()); <<== error

エラーは言う:

error: invalid initialization of non-const reference of type 'Variable&' \\
from an rvalue of type 'Variable'

Update 2
この問題はXSD メーリング リストで報告されており、次のリリースで解決される予定です。

4

2 に答える 2

4

プログラムが未定義の動作を呼び出します。
コンパイラが既に言ったように、Variableオブジェクトの有効期間は関数呼び出しに限定され、呼び出し後は返される参照は無効になります。

Variableオブジェクトを値で返すだけです

Variable UserObject::giveMeYourVariable() {

喜んで動かします。

于 2013-08-05T10:05:06.500 に答える
-3

2 回移動して、Variable オブジェクトを値で返す必要があります。

#include <utility>

class Variable {
public:
    // ctod/dtor things
    Variable() {}
    Variable(Variable&&) {}
    Variable& operator =(Variable&&) {return *this;}
    // ...
};

Variable foo() {
    Variable v;
    return std::move(v);
}

int main() {
    Variable v = std::move(foo());
    return 0;
}

std::move タイプを Variable から Variable&& に切り替えるだけで、move セマンティックでコンストラクターを呼び出すことができます

それで:

最初の std::move により、戻り用の一時オブジェクトを作成できます

2 番目の std::mode では、変数 v を作成できます

于 2013-08-05T10:34:10.150 に答える