C++新标准 侯捷(三) 标准库

14.右值引用

之所以放在标准库,是因为它虽是语言的部分,但接下来的东西都与标准库有关。

可以帮忙解决不必要的copy。

当赋值右边是一个右值时,左边的对象可以偷右边对象的资源。

Lvalue :可以出现于operator=左侧者;

Rvalue:只能出现于operator=右侧者。

我们试验发现,整数中a+b=42是不可以的,而字符串中s1+s2=s2,复数中c1+c2=cpmplex(4,9)却可以。

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来告诉你用右值。

15.Perfect Forwarding(完美的传递)

不完美的传递:右值经过forward()传给另一个函数后就变成了左值。

当然,标准库中解决了,不过比较复杂比较底层,因此不在这里具体探讨。用标准库的就可以完美传递,比如std::forward();

16.写一个move aware class(带有move意识的类)

big-three:拷贝构造,拷贝赋值,析构函数。

拷贝构造函数通常伴随着内存操作,因此需要抛出异常,而移动构造函数往往是移动内存所有权,因此不需要抛出异常,所以声明为noexcept。

str._data=null;       //重要,不然的话临时对象生命结束时会把数据部分一起delete。

 

 

 

你可能感兴趣的:(C++新标准 侯捷(三) 标准库)