簡體   English   中英

我為什么要使用std :: forward?

[英]Why should I use 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的代碼不會顯示任何副本/移動。

關於std::forward做什么以及如何工作(例如這里這里 )有很多好的帖子。

簡而言之, 它保留了其參數的值類別 完美轉發是為了確保提供給函數的參數被轉發到另一個函數(或在函數內使用),其具有與最初提供的相同的值類別(基本上是r值與l值)。 它通常與模板函數一起使用,其中可能發生了引用折疊 (涉及通用/轉發引用)。

考慮下面的代碼示例。 刪除std::forward將打印出requires lvalue並添加std::forward打印輸出requires rvalue func根據它是rvalue還是左值來重載。 在沒有std::forward情況下調用它會調用不正確的重載。 在這種情況下需要std::forward ,因為使用rvalue調用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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM