[英]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.