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

nakhodkin

私は次のコードを持っていますが、私が最も気になることがいくつかあります。

  1. 元のコンストラクター呼び出しはどの時点で発生しますか?
  2. どのような状況で、コピーコンストラクターが呼び出されますか?
#include <iostream>
#include <functional>

class Samp {
    char str[10] = "Default";
public:
    Samp(char s[]) { strcpy(str, s); printf("Constructor\n"); }
    Samp(const Samp& s) { printf("Copy Constructor\n"); }
    ~Samp() { printf("Destructor\n"); }

    char* out() {
        return str;
    }

    friend std::ostream& operator<<(std::ostream& stream, const Samp& s) {
        stream << s.str;

        return stream;
    }
};

void output(Samp s) {
    std::cout << s << std::endl;
}

int main(int argc, const char * argv[]) {
    std::function<void(Samp s)> o;
    o = output;

    o((char*)"Hello");

    return 0;
}

実行時に、プログラムは次の出力を提供します

Constructor
Copy Constructor
Default
Destructor
Destructor
Program ended with exit code: 0

ここに画像の説明を入力してください

んん

std::function呼び出しへの引数は、オブジェクト内に格納されている呼び出し可能オブジェクトに完全に転送されることによって渡されstd::functionます。

したがって、の動作はo(args...)と同じはありませんoutput(args...)代わりに、次と同じです。

output( std::forward<Args...>(args...) );

またはこの具体的な例では、

output( std::forward<Samp>( (char *)"Hello" ) );

この例では、このコードの動作がとわずかに異なるため、「完全な」転送はそれほど完全ではないことがわかりoutput( (char *)"Hello" );ます。

選択したオーバーロードの署名forwardSamp&& forward(Samp&& arg);です。したがって、argへの関数呼び出しのためにバインドするための一時的なマテリアライズが必要std::forwardです。それがあなたが見る「コンストラクター」です。

次に、「コピーコンストラクタ」はoutput、の戻り値からの関数のパラメータの初期化ですstd::forwardSamp移動コンストラクターがあれば、それ移動操作である可能性があります。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

このコードスニペットでコピーコンストラクターが2回呼び出されるのはなぜですか?

分類Dev

コピーを行う前にデストラクタが呼び出されるのはなぜですか?

分類Dev

コピーコンストラクターが次のステートメントで呼び出されるのはなぜですか:myVector.push_back(A());

分類Dev

代入演算子の後にこのコードでコピーコンストラクターが呼び出されるのはなぜですか?

分類Dev

式のreturnステートメントによってコピーコンストラクターが呼び出されるのはなぜですか?

分類Dev

以下のコードでコピーコンストラクターが2回呼び出されるのはなぜですか?

分類Dev

C ++なぜコピーコンストラクタが呼び出されたのですか?

分類Dev

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

分類Dev

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

分類Dev

c ++:コンストラクターがここで呼び出されるのはなぜですか

分類Dev

C ++プログラムのコピーコンストラクタが2回呼び出されるのはなぜですか?

分類Dev

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

分類Dev

単純なコンストラクターが呼び出された後にコピーコンストラクターが呼び出されるのはなぜですか?

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

テンプレート化されたコピーコンストラクタが呼び出されないのはなぜですか?

分類Dev

クラスコンストラクタが繰り返し呼び出されるのはなぜですか?

分類Dev

C#ベースコンストラクターが呼び出されないのはなぜですか?

分類Dev

コピーの初期化:コピーの省略がオフになっているのに、移動またはコピーコンストラクターが呼び出されなかったのはなぜですか?

分類Dev

呼び出されなくてもパブリックコピーコンストラクタが必要なのはなぜですか?

分類Dev

関数が戻ったときにコピーコンストラクターが呼び出されないのはなぜですか?

分類Dev

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

分類Dev

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

Related 関連記事

  1. 1

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

  2. 2

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

  3. 3

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

  4. 4

    このコードスニペットでコピーコンストラクターが2回呼び出されるのはなぜですか?

  5. 5

    コピーを行う前にデストラクタが呼び出されるのはなぜですか?

  6. 6

    コピーコンストラクターが次のステートメントで呼び出されるのはなぜですか:myVector.push_back(A());

  7. 7

    代入演算子の後にこのコードでコピーコンストラクターが呼び出されるのはなぜですか?

  8. 8

    式のreturnステートメントによってコピーコンストラクターが呼び出されるのはなぜですか?

  9. 9

    以下のコードでコピーコンストラクターが2回呼び出されるのはなぜですか?

  10. 10

    C ++なぜコピーコンストラクタが呼び出されたのですか?

  11. 11

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

  12. 12

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

  13. 13

    c ++:コンストラクターがここで呼び出されるのはなぜですか

  14. 14

    C ++プログラムのコピーコンストラクタが2回呼び出されるのはなぜですか?

  15. 15

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

  16. 16

    単純なコンストラクターが呼び出された後にコピーコンストラクターが呼び出されるのはなぜですか?

  17. 17

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

  18. 18

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

  19. 19

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

  20. 20

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

  21. 21

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

  22. 22

    テンプレート化されたコピーコンストラクタが呼び出されないのはなぜですか?

  23. 23

    クラスコンストラクタが繰り返し呼び出されるのはなぜですか?

  24. 24

    C#ベースコンストラクターが呼び出されないのはなぜですか?

  25. 25

    コピーの初期化:コピーの省略がオフになっているのに、移動またはコピーコンストラクターが呼び出されなかったのはなぜですか?

  26. 26

    呼び出されなくてもパブリックコピーコンストラクタが必要なのはなぜですか?

  27. 27

    関数が戻ったときにコピーコンストラクターが呼び出されないのはなぜですか?

  28. 28

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

  29. 29

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

ホットタグ

アーカイブ