2

移動セマンティクスを実装するクラスがある場合:

class BigObject
{
public:
    BigObject(something x = something()) { ... }
    BigObject(const BigObject& other) { ... }
    BigObject(BigObject&& other) { ... }
    BigObject& operator=(BigObject other) { ... }
    void swap(BigObject& other) { ... }
    // [...]
};


auto begin = std::begin(somethingSequence); // collection doesn't matter here
auto end = std::end(somethingSequence); // collection doesn't matter here

BigObjectOutputIterator dest; // collection doesn't matter here

ラムダでBigObjectを返す正しい方法は何ですか?

std::transform(begin, end, dest, 
    [](something x) -> BigObject {return BigObject(x); });

また

std::transform(begin, end, dest, 
    [](something x) -> BigObject&& {return std::move(BigObject(x)); });

また

std::transform(begin, end, dest, 
    [](something x) -> BigObject {return std::move(BigObject(x)); });

または他の形式?

ありがとう。

4

2 に答える 2

6

1 番目と 3 番目の形式は基本的に同じです。これreturn BigObject(x);は が右辺値であり、move コンストラクターが既に呼び出されているためです。

ただし、2 番目の形式は未定義の動作を呼び出します。右辺値参照は依然として単なる参照であり、スコープ外にあるものへの参照は以前と同じくらい悪いものです。

于 2011-12-08T11:46:45.497 に答える
3

最初の形式は問題ありません。原則として、絶対に右辺値参照を返すことはありません。BigObject(x)3番目のフォームは、すでに右辺値であるため、移動する必要はありません。

于 2011-12-08T11:29:32.053 に答える