练习13.55:
//右值引用版本的push_back
void push_back(std::string&& s)&& { data->push_back(s); };
练习13.56:
首先会拷贝本对象创建一个副本,返回它的sort()成员,是一个左值,然后继续递归,陷入死循环,直至堆栈溢出
练习13.57:
这里sort函数返回的是一个临时的变量,是一个右值,程序正常运行,不会递归调用陷入死循环,但是由于是左值或者const限定的,排序的只是临时变量,原来的左值顺序不会发生变化
练习13.58:
简易的新版本Foo类,使用练习13.56中的左值返回
#include <iostream>
#include <string>
using namespace std;
#include <vector>
#include <algorithm>
class Foo {
public:
//可用于可改变的左值
Foo sorted() &&;
//可用于任何类型的Foo
Foo sorted() const &;
//Foo的其他成员的定义
private:
vector<int> data;
};
//本对象为右值,因此可以原址排序
Foo Foo::sorted()&&
{
sort(data.begin(), data.end());
return *this;
}
//本对象是const或是一个左值,哪种情况我们都不能对其进行原址排序
Foo Foo::sorted()const &
{
//拷贝一个副本
Foo ret(*this);
cout << "Foo Foo::sorted()const &" << endl;
//返回副本排序
return ret.sorted();
}
int main()
{
Foo f;
f.sorted();
system("pause");
return 0;
}
发生循环递归,导致堆栈溢出
将soerted函数换为练习13.57的右值返回版本
Foo Foo::sorted()const &
{
cout << "Foo Foo::sorted()const &" << endl;
return Foo(*this).sorted();
}
发现不会报错,程序正常运行,但是排序的只是副本,而不是原对象
测试:
int main()
{
vector<int>v = { 2,5,8,5,3,9 };
Foo f(v);
f.sorted();
f.print();
system("pause");
return 0;
}
结果: