2

SO で答えを読んで、彼は で a を渡しましvectormove。正しい方法は、使用せずに単純に渡すことだと思いましたmove

class B
{
    std::vector<T> data;

public:
    B(std::vector<T> p) : data(std::move(p)) {}
                               ^^^^^^^^^^^^
                                     ?
};

2 番目の方法は次のとおりです。

class B
{
    std::vector<T> data;

public:
    B(std::vector<T> p) : data(p) {}
};

どちらが正しいですか?

4

2 に答える 2

2

関数の引数は既に値として取得されているため、コピーは既に作成されています。ローカル オブジェクトpは間違いなくあなたのものであり、あなただけのものであるため、無条件にそこから移動できます。

引数を値で取得する利点は、左辺値と右辺値の両方で機能することです。左辺値の場合は、他に何もできないため、本物のコピーを作成しますが、右辺値の場合は、関数の引数自体を移動することで構築できるため、高価な建設がこれまでに 1 回発生しただけで、他のすべてが移動します。

于 2013-09-22T14:22:26.180 に答える