之所以放在标准库,是因为它虽是语言的部分,但接下来的东西都与标准库有关。
可以帮忙解决不必要的copy。
当赋值右边是一个右值时,左边的对象可以偷右边对象的资源。
Lvalue :可以出现于operator=左侧者;
Rvalue:只能出现于operator=右侧者。
我们试验发现,整数中a+b=42是不可以的,而字符串中s1+s2=s2,复数中c1+c2=cpmplex
int foo(){return 5;}
...
int x=foo(); //OK
int *p = &foo(); //[Error]右边是取函数返回值得地址,但返回值是个右值
foo() = 7; //[Error]
所以必须有语法让我们在调用端告诉编译器“这是个右值”。在被调用端
c.insert(ite,Vtype(buf));//临时对象,告诉你用右值。
M c2(std::move(c1));//通过move来告诉你用右值。
不完美的传递:右值经过forward()传给另一个函数后就变成了左值。
当然,标准库中解决了,不过比较复杂比较底层,因此不在这里具体探讨。用标准库的就可以完美传递,比如std::forward();
big-three:拷贝构造,拷贝赋值,析构函数。
拷贝构造函数通常伴随着内存操作,因此需要抛出异常,而移动构造函数往往是移动内存所有权,因此不需要抛出异常,所以声明为noexcept。
str._data=null; //重要,不然的话临时对象生命结束时会把数据部分一起delete。