c++11之完美转发std::forward()(一百一三十三)
C++ 11 完美 转发 std forward 三十三 一百
2023-09-14 09:09:57 时间
其实对于 std::move来说,只做了一件事。可以初步的理解为 (不过当然是错误的)
template<typename T>
T&& move(T& val)
{
return static_cast<T&&>(val);
}
move 只是纯粹的将一个左值转化为了一个右值,STL实现基本都已经实现了移动语义,相当于对于 vector<T>::push_back()
有两个版本的实现,简单写如下:
template<typename T>
class Vector
{
void push_back(T& lval);
void push_back(T&& rval);
};
而对应的类型 T 也实现了移动拷贝,如下:
class T
{
T(T& other)
{
// copy constructor
}
T(T&& other)
{
// move constructor
}
};
代码有性能提升
完美转发 std::forward()
当我们将一个右值引用传入函数时,他在实参中有了命名,所以继续往下传或者调用其他函数时,根据C++ 标准的定义,这个参数变成了一个左值。那么他永远不会调用接下来函数的右值版本,这可能在一些情况下造成拷贝。为了解决这个问题 C++ 11引入了完美转发,根据右值判断的推倒,调用forward 传出的值,若原来是一个右值,那么他转出来就是一个右值,否则为一个左值。
这样的处理就完美的转发了原有参数的左右值属性,不会造成一些不必要的拷贝。代码如下:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
string A("abc");
string&& Rval = std::move(A);
string B(Rval); // this is a copy , not move.
cout << A << endl; // output "abc"
string C(std::forward<string>(Rval)); // move.
cout << A << endl; /* output "" */
return 0;
}
std::forward
右值引用类型是独立于值的,一个右值引用参数作为函数的形参,在函数内部再转发该参数的时候它已经变成一个左值,并不是他原来的类型。
如果我们需要一种方法能够按照参数原来的类型转发到另一个函数,这种转发类型称为完美转发。
template<typename T>
void print(T& t){
cout << "lvalue" << endl;
}
template<typename T>
void print(T&& t){
cout << "rvalue" << endl;
}
template<typename T>
void TestForward(T && v){
print(v);
print(std::forward<T>(v));
print(std::move(v));
}
int main(){
TestForward(1);
int x = 1;
TestForward(x);
TestForward(std::forward<int>(x));
return 0;
}
相关文章
- 蓝桥杯官网 试题 PREV-115 历届真题 轨道炮【第十届】【决赛】【研究生组】【C++】【Java】两种解法
- 有效的完全平方数(C++)
- 【华为OD机试 2023最新 】整理扑克牌(C++ 100%)
- 解答私信@icey�192 //2021-11-1 C++ 已知1900是鼠年,输入一个年份,输出其对应的生肖。
- 解答私信@YWang521 //C++ 编写程序,计算序列 1-2/3+3/5-4/7+5/9-6/11+...+(-1)^(n-1)/(2n-1)的前n项之和
- 完美解决动态库问题libstdc++.so.6: version `CXXABI_1.3.11‘ not found
- Android 中 C++ Thread线程用法(五十七)
- 详解c++[指针的指针] 和 [指针的引用](五十五)
- C++11/14高速上手手册(三十六)
- C++11使用表格驱动技术替换switch case
- VC++处理窗口的常用API函数及窗口处理经验总结(附源码)
- C++11 std::function函数包装器
- C++11 final/override控制
- C++11—lambda函数
- 遇到的C++ cli 转 C++ native 为C# 程序提供接口。
- C++编程经验(12):C++11新特性