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 是必要的?
C++11的右值引用移动语义(std::move)和完美转发(std::forward)详解