なぜstd :: forwardを使用する必要があるのですか?

ディーン

以下のコードでは、std::forward引数を渡すときになぜ使用する必要がありますか?

class Test {
  public:
  Test() {
      std::cout << "ctor" << std::endl;
  }
  Test(const Test&) {
      std::cout << "copy ctor" << std::endl;
  }
  Test(const Test&&) {
      std::cout << "move ctor" << std::endl;
  }
};

template<typename Arg>
void pass(Arg&& arg) {
    // use arg..
    return; 
}

template<typename Arg, typename ...Args>
void pass(Arg&& arg, Args&&... args)
{
    // use arg...
    return pass(args...); // why should I use std::forward<Arg>(args)... ?
}

int main(int argc, char** argv)
{
    pass(std::move<Test>(Test()));

    return 0;
}

コードの有無にかかわらずstd::forward、コピー/移動は表示されません。

Niall

std::forwardがどのように機能するかについての良い投稿がたくさんありますここここなど)。

一言で言えば、引数の値カテゴリを保持します関数に提供された引数が、最初に提供されたものと同じ値カテゴリ(基本的にr値とl値)を持つ別の関数に転送される(または関数内で使用される)ことを保証するために、完全な転送がありますこれは通常、参照の折りたたみが行われた可能性のあるテンプレート関数で使用されます(ユニバーサル/転送参照を含む)。

以下のコードサンプルを検討してください。std::forwardプリントアウトrequires lvalue削除し、プリントアウトを追加std::forwardrequires rvalueます。funcそれは右辺値または左辺値であるかどうかに基づいてオーバーロードされます。呼び出しなしでそれをstd::forward呼び出すと、誤ったオーバーロード呼び出されます。std::forwardこの場合には必要とされてpass右辺値と呼ばれています。

#include <utility>
#include <iostream>
class Test {
  public:
  Test() {
      std::cout << "ctor" << std::endl;
  }
  Test(const Test&) {
      std::cout << "copy ctor" << std::endl;
  }
  Test(Test&&) {
      std::cout << "move ctor" << std::endl;
  }
};

void func(Test const&)
{
    std::cout << "requires lvalue" << std::endl;
}

void func(Test&&)
{
    std::cout << "requires rvalue" << std::endl;
}

template<typename Arg>
void pass(Arg&& arg) {
    // use arg here
    func(std::forward<Arg>(arg));
    return; 
}

template<typename Arg, typename ...Args>
void pass(Arg&& arg, Args&&... args)
{
    // use arg here
    return pass(std::forward<Args>(args)...);
}

int main(int, char**)
{
    pass(std::move<Test>(Test()));
    return 0;
}

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

std :: make_pairを使用する必要があるのはなぜですか?

分類Dev

なぜflatMapを使用する必要があるのですか?

分類Dev

なぜ基数を使用する必要があるのですか?

分類Dev

なぜEMFを使用する必要があるのですか?

分類Dev

なぜIDEを使用する必要があるのですか?

分類Dev

SerializeFieldを使用する必要があるのはなぜですか?

分類Dev

SerializeFieldを使用する必要があるのはなぜですか?

分類Dev

なぜJPanelを使用する必要があるのですか?

分類Dev

Rails。なぜActiveRecordを使用する必要があるのですか?

分類Dev

なぜDjangoREST APIを使用する必要があるのですか?

分類Dev

なぜstrdup()を使用する必要があるのですか?

分類Dev

なぜgruntを使用する必要があるのですか-useminPrepare

分類Dev

chrootを使用する必要があるのはなぜですか

分類Dev

なぜ@ngrx / storeを使用する必要があるのですか?

分類Dev

なぜreduxreact Nativeを使用する必要があるのですか?

分類Dev

次の場合にstd :: decayを使用する必要があるのはなぜですか?

分類Dev

Fortranで「使用のみ」を使用する必要があるのはなぜですか

分類Dev

特に、std :: vector&ではなくstd :: spanを関数に渡す必要があるのはなぜですか?

分類Dev

なぜshutdownNow()ではなくawaitTerminationを使用する必要があるのですか?

分類Dev

'react'からimportReactを使用する必要があるのはなぜですか

分類Dev

AndroidでRequestQueueを使用する必要があるのはなぜですか?

分類Dev

StackでDequeを使用する必要があるのはなぜですか?

分類Dev

$ resourceで$ promiseを使用する必要があるのはなぜですか?

分類Dev

Flutterでカードを使用する必要があるのはなぜですか?

分類Dev

Angular UnitTestingでJasmineSpy Objectを使用する必要があるのはなぜですか?

分類Dev

mongoDBクエリで+を使用する必要があるのはなぜですか

分類Dev

ReactJsでweb-packを使用する必要があるのはなぜですか?

分類Dev

C ++の完全な転送:const_cast()を使用できるのに、なぜforward()が必要なのですか?

分類Dev

jQueryにGoogleのCDNを使用する必要があるのはなぜですか?

Related 関連記事

  1. 1

    std :: make_pairを使用する必要があるのはなぜですか?

  2. 2

    なぜflatMapを使用する必要があるのですか?

  3. 3

    なぜ基数を使用する必要があるのですか?

  4. 4

    なぜEMFを使用する必要があるのですか?

  5. 5

    なぜIDEを使用する必要があるのですか?

  6. 6

    SerializeFieldを使用する必要があるのはなぜですか?

  7. 7

    SerializeFieldを使用する必要があるのはなぜですか?

  8. 8

    なぜJPanelを使用する必要があるのですか?

  9. 9

    Rails。なぜActiveRecordを使用する必要があるのですか?

  10. 10

    なぜDjangoREST APIを使用する必要があるのですか?

  11. 11

    なぜstrdup()を使用する必要があるのですか?

  12. 12

    なぜgruntを使用する必要があるのですか-useminPrepare

  13. 13

    chrootを使用する必要があるのはなぜですか

  14. 14

    なぜ@ngrx / storeを使用する必要があるのですか?

  15. 15

    なぜreduxreact Nativeを使用する必要があるのですか?

  16. 16

    次の場合にstd :: decayを使用する必要があるのはなぜですか?

  17. 17

    Fortranで「使用のみ」を使用する必要があるのはなぜですか

  18. 18

    特に、std :: vector&ではなくstd :: spanを関数に渡す必要があるのはなぜですか?

  19. 19

    なぜshutdownNow()ではなくawaitTerminationを使用する必要があるのですか?

  20. 20

    'react'からimportReactを使用する必要があるのはなぜですか

  21. 21

    AndroidでRequestQueueを使用する必要があるのはなぜですか?

  22. 22

    StackでDequeを使用する必要があるのはなぜですか?

  23. 23

    $ resourceで$ promiseを使用する必要があるのはなぜですか?

  24. 24

    Flutterでカードを使用する必要があるのはなぜですか?

  25. 25

    Angular UnitTestingでJasmineSpy Objectを使用する必要があるのはなぜですか?

  26. 26

    mongoDBクエリで+を使用する必要があるのはなぜですか

  27. 27

    ReactJsでweb-packを使用する必要があるのはなぜですか?

  28. 28

    C ++の完全な転送:const_cast()を使用できるのに、なぜforward()が必要なのですか?

  29. 29

    jQueryにGoogleのCDNを使用する必要があるのはなぜですか?

ホットタグ

アーカイブ