ラムダで呼び出されたコンストラクターの移動

イゴール・シェボ

ラムダがC ++でどのように機能するかを深く理解しようとしています。私は次のコードを書きました。

#include <iostream>
#include <functional>

struct A
{
    A() { std::cout << "A" << (data = ++count) << ' '; }
    A(const A& a) { std::cout << "cA" << (data = a.data + 20) << ' '; }
    A(A&& a) { std::cout << "mA" << (data = std::move(a.data) + 10) << ' '; }
    ~A() { std::cout << "dA" << data << ' '; }
    int data;
    static int count;
};

int A::count = 0;

void f(A& a, std::function<void(A)> f)
{
    std::cout << "( ";
    f(a);
    std::cout << ") ";
}

int main()
{
    A temp, x;
    auto fun = [=](A a) {std::cout << a.data << '|' << x.data << ' ';};
    std::cout << "| ";
    f(temp, fun);
    std::cout << "| ";
}

出力は以下のとおりです。

A1 A2 cA22 | cA42 mA52 dA42(cA21 mA31 31 | 52 dA31 dA21)dA52 | dA22 dA2 dA1

'mA52'のmoveコンストラクター呼び出しを除いて、これは私には非常に明白です値による変数キャプチャを使用していることに注意してください。したがって、moveコンストラクターがないと、copyコンストラクターがここで呼び出されます。このステップで追加のコピー/移動があるのはなぜですか?fun引数として値が渡された場合、オブジェクト1回だけコピーされると予想されますfさらに、オブジェクトの最初のコピーはすぐに破棄されます。どうして?この中間コピーは何ですか?

user743382

ラムダ型と呼びましょうL名前はありませんが、名前なしで参照すると混乱します。

コンストラクターstd::function<void(A)>(L l)L値を取ります。これには、元ののコピーの作成が含まれfunます。

次に、コンストラクターはラムダをラッパーlによって管理されるストレージに移動std::function<void(A)>ます。その移動には、キャプチャされたエンティティの移動も含まれます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

`unique_ptr`の移動中にコピーコンストラクターがラムダで呼び出されるのはなぜですか?

分類Dev

移動コンストラクターが呼び出されなかったのはなぜですか?

分類Dev

ラムダで移動するときにmoveコンストラクターが呼び出されないのはなぜですか?

分類Dev

呼び出されないコンストラクターの移動

分類Dev

MSVCでの配列の初期化中に、コピーまたは移動コンストラクタなしで呼び出されたデストラクタ

分類Dev

移動コンストラクターが呼び出されるのはなぜですか?

分類Dev

移動コンストラクターではなくコピーコンストラクターが呼び出されるのはなぜですか?

分類Dev

移動コンストラクターが呼び出されない理由

分類Dev

移動コンストラクターが呼び出されない

分類Dev

移動コンストラクターのunique_ptrでstd :: moveを呼び出すときの「エラー:削除された関数の使用」

分類Dev

コピーコンストラクタと移動コンストラクタが一緒に呼び出されるのはなぜですか?

分類Dev

移動コンストラクターが呼び出されたときに混乱しますか?

分類Dev

移動コンストラクターはboost :: asio :: ip :: tcp :: socketでは呼び出されません

分類Dev

コピーコンストラクターと移動コンストラクターの実行時間は同じで、移動コンストラクターは呼び出されていません

分類Dev

メンバーinitilizerが移動したときに追加のコンストラクター呼び出しを呼び出すのはなぜですか?

分類Dev

コンストラクターへの引数として指定されたラムダからインスタンスメソッドを呼び出す

分類Dev

例外をスローするときに移動コンストラクターが呼び出されない

分類Dev

動的に生成されたオブジェクトのコンストラクターを呼び出す

分類Dev

動的に生成されたオブジェクトのコンストラクターを呼び出す

分類Dev

移動コンストラクターの意図しない呼び出し

分類Dev

コンストラクターで呼び出されるSetState()

分類Dev

この場合、非定数右辺値移動コンストラクターが呼び出されるのはなぜですか?

分類Dev

移動コンストラクターが呼び出されることを確認する

分類Dev

移動コンストラクターが呼び出されることはありません

分類Dev

移動コンストラクターが呼び出されることはありません

分類Dev

移動コンストラクターが期待どおりに呼び出されない

分類Dev

移動コンストラクターが呼び出されていません

分類Dev

の削除されたコンストラクターの呼び出し

分類Dev

インターフェイス(C ++)で削除されたコンストラクターの呼び出し

Related 関連記事

  1. 1

    `unique_ptr`の移動中にコピーコンストラクターがラムダで呼び出されるのはなぜですか?

  2. 2

    移動コンストラクターが呼び出されなかったのはなぜですか?

  3. 3

    ラムダで移動するときにmoveコンストラクターが呼び出されないのはなぜですか?

  4. 4

    呼び出されないコンストラクターの移動

  5. 5

    MSVCでの配列の初期化中に、コピーまたは移動コンストラクタなしで呼び出されたデストラクタ

  6. 6

    移動コンストラクターが呼び出されるのはなぜですか?

  7. 7

    移動コンストラクターではなくコピーコンストラクターが呼び出されるのはなぜですか?

  8. 8

    移動コンストラクターが呼び出されない理由

  9. 9

    移動コンストラクターが呼び出されない

  10. 10

    移動コンストラクターのunique_ptrでstd :: moveを呼び出すときの「エラー:削除された関数の使用」

  11. 11

    コピーコンストラクタと移動コンストラクタが一緒に呼び出されるのはなぜですか?

  12. 12

    移動コンストラクターが呼び出されたときに混乱しますか?

  13. 13

    移動コンストラクターはboost :: asio :: ip :: tcp :: socketでは呼び出されません

  14. 14

    コピーコンストラクターと移動コンストラクターの実行時間は同じで、移動コンストラクターは呼び出されていません

  15. 15

    メンバーinitilizerが移動したときに追加のコンストラクター呼び出しを呼び出すのはなぜですか?

  16. 16

    コンストラクターへの引数として指定されたラムダからインスタンスメソッドを呼び出す

  17. 17

    例外をスローするときに移動コンストラクターが呼び出されない

  18. 18

    動的に生成されたオブジェクトのコンストラクターを呼び出す

  19. 19

    動的に生成されたオブジェクトのコンストラクターを呼び出す

  20. 20

    移動コンストラクターの意図しない呼び出し

  21. 21

    コンストラクターで呼び出されるSetState()

  22. 22

    この場合、非定数右辺値移動コンストラクターが呼び出されるのはなぜですか?

  23. 23

    移動コンストラクターが呼び出されることを確認する

  24. 24

    移動コンストラクターが呼び出されることはありません

  25. 25

    移動コンストラクターが呼び出されることはありません

  26. 26

    移動コンストラクターが期待どおりに呼び出されない

  27. 27

    移動コンストラクターが呼び出されていません

  28. 28

    の削除されたコンストラクターの呼び出し

  29. 29

    インターフェイス(C ++)で削除されたコンストラクターの呼び出し

ホットタグ

アーカイブ