C++11 std::forward(配合&&右值引用)

Posted Dontla

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++11 std::forward(配合&&右值引用)相关的知识,希望对你有一定的参考价值。

代码1:

#include <iostream>
#include <string>

template<typename T>
void customCout(T&& arg) 
    std::cout << arg;


template<typename T, typename... Args>
void customCout(T&& arg, Args&&... args) 
    std::cout << arg;
    customCout(std::forward<Args>(args)...);


int main() 
    char c[1024] = "sdfdf\\n";
    //customCout("Hello ", "world! ", 123, 456.789, a, "\\n");
    std::string s = "dfdsf"; 
    customCout(s, " ", c, " ", 123, "\\n");
    return 0;



问:std::forward<Args>(args)...是什么意思?

答:std::forward<Args>(args) 是 C++ 中的一种语法,它是使用模板的一种方法。
在模板函数中,std::forward<Args>(args) 用于将传入的可变参数列表的参数转发到另一个函数中。这种技术用于实现某些高级技术,例如右值引用、完美转发等。
在这个语句中,std::forward<Args>(args) 表示对可变参数列表 args 中的每个参数都执行 std::forward。其中 std::forward 是 C++ STL 库中的一个函数模板,它用于将参数转发给另一个函数。

代码2:

# if 0
#include <iostream>

template<typename T>
void print(T t) 
    std::cout << t << std::endl;


template<typename T, typename... Args>
void print(T t, Args... args) 
    std::cout << t << " ";
    print(args...);


int main() 
    print("hello", 1, 3.14, 'A');
    return 0;

#endif


#include <iostream>

template<typename T>
void print(T&& t) 
    std::cout << t << std::endl;


template<typename T, typename... Args>
void print(T&& t, Args&&... args) 
    std::cout << t << " ";
    print(std::forward<Args>(args)...);


int main() 
    print("hello", 1, 3.14, 'A');
    return 0;

问:上面两部分代码有什么区别?

答:
两段代码的区别是:
- 第一段代码中,模板函数的参数是传值方式,每一个参数都会被复制一份,并作为函数内部的参数使用。
- 第二段代码中,模板函数的参数是传递方式,每一个参数不会被复制一份,并作为函数内部的参数使用。使用 std::forward<T> 可以在模板中使用右值引用的传递方式。
简单来说,第一段代码增加了参数复制的代价,第二段代码提高了效率,因为它避免了参数的复制。

以上是关于C++11 std::forward(配合&&右值引用)的主要内容,如果未能解决你的问题,请参考以下文章

c++11:为啥 std::forward 中的 static_assert 是必要的?

std::move和std::forward

C++11的右值引用移动语义(std::move)和完美转发(std::forward)详解

我应该啥时候 std::forward 函数调用?

C++ STL应用与实现7: 如何使用std::forward_list 单链表 (since C++11)

寻求对 std::forward 的澄清