学习C++新特性(二)
1、右值引用
c++11之前,
左值:表达式之后还持久存在的对象;
右值:表达式结束后不存在的临时对象;
c++11之后
右值分纯右值、将亡值;
纯右值:纯粹的字面量(如 10,true)或者求值结果相当于字面量或匿名临时对象。(字符串字面量只有在类中是右值,在普通函数中是左值)。
将亡值:即将被销毁却能移动的值。
右值引用:T && 将临时对象传递给变量,使得将亡值延续。
使用move可以将左值改为右值引用
string s1="this is "; // s1w为左值string&& yr1 = move(s1); yr1是右值引用 okstring&& yr1 = s1; fail
移动语义
利用move来使得原来对象传递的拷贝 析构等过程简化
v.push_back(str); // 将使用 push_back(const T&), 即产生拷贝行为
std::cout << "str: " << str << std::endl; // 将输出 "str: Hello world."v.push_back(std::move(str));
// 将使用 push_back(const T&&), 不会出现拷贝行为
// 而整个字符串会被移动到 vector 中,所以有时候 std::move 会用来减少拷贝出现的开销
// 这步操作后, str 中的值会变为空
std::cout << "str: " << str << std::endl; // 将输出 "str: "
左引用:c++11之前,引用都是左引用,加了const的常引用可以看作右引用
右引用 加上 && 来表示的为右引用
const int& f= 1; //可以看作右引用int && d = 2; // 右引用d = 12;
引用坍缩规则可以使得只有当 实参为右引用时才能被推导为右引用类型。
完美转换 使用std::forward<T>(value) 来实现转发引用的类型与实参类型保持一致
学习C++新特性(二)
1、右值引用
c++11之前,
左值:表达式之后还持久存在的对象;
右值:表达式结束后不存在的临时对象;
c++11之后
右值分纯右值、将亡值;
纯右值:纯粹的字面量(如 10,true)或者求值结果相当于字面量或匿名临时对象。(字符串字面量只有在类中是右值,在普通函数中是左值)。
将亡值:即将被销毁却能移动的值。
右值引用:T && 将临时对象传递给变量,使得将亡值延续。
使用move可以将左值改为右值引用
string s1="this is "; // s1w为左值string&& yr1 = move(s1); yr1是右值引用 okstring&& yr1 = s1; fail
移动语义
利用move来使得原来对象传递的拷贝 析构等过程简化
v.push_back(str); // 将使用 push_back(const T&), 即产生拷贝行为
std::cout << "str: " << str << std::endl; // 将输出 "str: Hello world."v.push_back(std::move(str));
// 将使用 push_back(const T&&), 不会出现拷贝行为
// 而整个字符串会被移动到 vector 中,所以有时候 std::move 会用来减少拷贝出现的开销
// 这步操作后, str 中的值会变为空
std::cout << "str: " << str << std::endl; // 将输出 "str: "
左引用:c++11之前,引用都是左引用,加了const的常引用可以看作右引用
右引用 加上 && 来表示的为右引用
const int& f= 1; //可以看作右引用int && d = 2; // 右引用d = 12;
引用坍缩规则可以使得只有当 实参为右引用时才能被推导为右引用类型。
完美转换 使用std::forward<T>(value) 来实现转发引用的类型与实参类型保持一致
发布评论