右值引用
-
左值:指可在赋值表达式等号左边出现的元素,包括具名对象、在栈数据段和堆数据段上分配的对象、其他对象的数据成员,或一切具有确定存储范围的数据项。
-
左值引用:
int var = 42;
int& ref = var;
ref = 99; //var也被改为99
- 右值:指只能在赋值表达式等号右边出现的元素,如字面值和临时变量。
- 右值引用:使用两个&
int&& i=42;
用处
- 从拷贝构造函数变为移动构造函数(只需要拷贝指向临时变量的指针,并将原来指向临时变量的指针改为空) 节约内存且省去了复制数据本体的时间。
- 实现资源转移,不必复制整份数据,而可以将数据作为参数传入函数,对其中的某一部分进行处理。
- 移动语义取代不合理的复制语义。
删除函数
如何禁止某个类的复制行为?
C++11:声明函数的语句只要追加"=delete"修饰,函数即被声明为删除。=delete可修饰任何函数。
class no_copies
{
public:
no_copies(){}
no_copies(no_copies const&) = delete;
no_copies(& operator=(no_copies const&) = delete;
}
删除拷贝构造函数和复制赋值操作符,又显式写出移动构造函数和移动赋值操作符,就是一种move_only type。
class move_only
{
std::unique_ptr(my_class) data;
public:
move_only(const move_only&) = delete;
move_only(move_only&& other):
data(std::move(other.data))
{}
move_only& operator=(const move_only&) = delete;
move_only& operator=(move_only&& other)
{
data=std::move(other.data);
return *this;
}
};
move_only m1;
move_only m2(m1);//错误
move_only m3(std::move(m1)); //正确 移动构造函数
默认函数
在目标函数声明后方添加"=default"则变为默认函数。默认构造函数、析构函数、拷贝构造函数、移动构造函数、复制赋值操作符和移动赋值操作符等菜有资格被设置为默认。
constexpr关键字
constexpr int square(int x)
{
return x*x;
}
int array[square(5)];
假设某函数的参数和返回值都满足一定要求,且函数体足够简单,就可以被声明为constexpr函数,进而在常量表达式中使用。
来自:《C++并发编程实战》
欢迎指正