右值引用
"右值"没有严谨的定义, 通常来说, 出现在等号右边的内容就是右值, 可以取地址, 有名字的就是左值
不跟对象关联的字面值等称为纯右值, 其他右值称为将亡值
右值引用是为了优化对临时对象进行深拷贝的效率...右值引用形成的拷贝/赋值函数称为移动拷贝/赋值, 核心是直接窃走目标对象内部指针指向的内存内容, 然后置空目标对象的指针
无论声明了左值引用还是右值引用, 都必须在声明时立即初始化(参数列和初始化列表也算立即初始化..., 因此应该用noexcept修饰移动构造函数
move也有std::move_if_noexcept的版本, 其在当前函数没有noexcept时主动转换为左值应用从而调用拷贝构造版本....但显然这种做法损失性能
只要定义中出现了左值引用, 引用折叠规则就会将其变为左值引用, 这是std::forward()的核心原理
编译器优化的时候本身就打开了返回值优化功能, 因此返回右值并不是很必要的事...而且由于其本质是常量数值的原因, enum成员总是可以被隐式转换为整型, 这很容易导致比较两个不同的枚举名称时出现错误的结果
C++11之前会通过类结构将枚举封装, 并建立新的转换和比较函数覆盖原先的操作