标签:turn operator span bsp back stream except prim 地址
练习13.55
1 void push_back(const string& s) &&;
练习13.56
此时拷贝一个副本,但是问题来了,ret是一个左值,返回他的sorted函数,会不停的进行递归自己,而该函数并没有一个终止条件,所以最后堆栈会溢出,导致程序异常终止;
练习13.57
此时函数返回的是一个临时对象的sorted函数,而临时对象是一个右值,这时会调用右值的sorted重载函数,程序正常运行,但是原对象依然没有排序,因为他是一个const或者是一个左值,改变的只是临时对象的元素顺序,但是很遗憾,临时对象在函数运行完就被销毁了。注意一点,上一题的是一个左值,他作用于整个函数体作用域。简单来说他是有地址的。
练习13.58
1 #include <iostream> 2 #include <string> 3 #include <memory> 4 #include <vector> 5 #include <algorithm> 6 #include <numeric> 7 8 using namespace std; 9 10 class Foo { 11 friend void print(const Foo &); 12 public: 13 Foo(); 14 Foo(vector<int> &a); 15 Foo(const Foo&); 16 Foo& operator=(const Foo&); 17 Foo(Foo &&) noexcept; 18 Foo & operator=(Foo&& ) noexcept; 19 Foo sorted() const &; 20 Foo sorted() &&; 21 private: 22 vector<int> data; 23 }; 24 25 void print(const Foo &); 26 27 int main() 28 { 29 vector<int> vec{ 1,3,5,2,6,3,7,4,0 }; 30 Foo f1; 31 Foo f2(vec); 32 print(f1); 33 print(f2); 34 f1 = std::move(f2); 35 print(f1); 36 print(f2); 37 Foo f3(vec); 38 print(f3.sorted()); 39 //print(std::move(f3).sorted()); 40 print(f3); 41 system("pause"); 42 return 0; 43 } 44 45 Foo::Foo() 46 { 47 vector<int> data1(10, 0); 48 data = data1; 49 } 50 51 Foo::Foo(vector<int>& a) 52 { 53 data = a; 54 } 55 56 Foo::Foo(const Foo &f) 57 { 58 data = f.data; 59 } 60 61 Foo & Foo::operator=(const Foo &f) 62 { 63 data = f.data; 64 return *this; 65 // TODO: 在此处插入 return 语句 66 } 67 68 Foo::Foo(Foo &&f) noexcept 69 { 70 data = std::move(f.data); 71 } 72 73 Foo & Foo::operator=(Foo &&f) noexcept 74 { 75 data = std::move(f.data); 76 return *this; 77 // TODO: 在此处插入 return 语句 78 } 79 80 Foo Foo::sorted() const & 81 { 82 Foo ret(*this); 83 /*sort(ret.data.begin(), ret.data.end()); 84 cout << "1" << endl;*/ 85 cout << &ret << endl; 86 return ret.sorted(); 87 //return Foo(*this).sorted(); 88 } 89 90 Foo Foo::sorted() && 91 { 92 sort(data.begin(), data.end()); 93 cout << "0" << endl; 94 return *this; 95 } 96 97 void print(const Foo &f) 98 { 99 for (auto c : f.data) 100 cout << c << " "; 101 cout << endl; 102 }
标签:turn operator span bsp back stream except prim 地址
原文地址:http://www.cnblogs.com/wuyinfenghappy/p/7486774.html