, 如果定义了常量左值引用构造也能正确执行, 只不过会变为拷贝形式
常量右值引用存在但是没有实际用途
std::move()能强制使一个左值变为右值, 但是不会改变其生命周期
右值引用本身是个左值,..., 因此应该用noexcept修饰移动构造函数
move也有std::move_if_noexcept的版本, 其在当前函数没有noexcept时主动转换为左值应用从而调用拷贝构造版本...., 所以不会降低效率
标准库中的std::result_of()内部的type命名本质就是decltype
decltype有所谓的推导四原则:
如果目标是一个没有带括号的标记符表达式(也就是除去关键字...如果目标是被重载的函数则编译错误
否则, 对于带括号的表达式, 如果目标是将亡值, 那么返回右值引用
对于带括号的表达式, 如果目标是左值, 返回左值引用
否则返回目标本身类型
推导四规则中最麻烦的是规则...3, 一种编程习惯是当需要用decltype定义变量时, 先声明再定义, 这样如果被编译器推导为左值引用的话会由于没有初始化而报错, 从而提供改错的机会
decltype能够带走目标的cv限制符, 但是无法继承对象内部的