C++_左值引用和右值引用

移动和拷贝

标准库容器、string 和 shared_ptr 类既  支持移动也支持拷贝。
--赋值和拷贝
    对象大 对象本身要求内存分配--不必复制
IO 类和 unique_ptr 类 可以移动但不能拷贝
   01.IO类型不可存储在vector容器中。
    (IO是流对象,而流对象是不能复制的,所以不能存储在vector容器中 IO对象不可复制或赋值
	 不能将 形参 或 返回类型 设置为 流类型。进行 IO 操作的函数通常以引用方式 传递和 返回流。
	读写一个 IO 对象会改变其状态,因此传递和返回的引用不能是 const
	传递或返回IO对象,则必须传递或返回指向该对象的指针或引用。
  02.unique_ptr智能指针在同一时间只允许一个智能指针管理动态开辟的空间
    std::unique_ptr的特性之一是它不能被复制,因为它拥有对其所管理的对象的唯一所有权。
	然而,它可以被移动,这意味着可以将其所有权从一个std::unique_ptr转移到另一个std::unique_ptr

右值引用

右值引用和移动语义  std::unique_ptr
   普通左值引用  
        左值引用就是给左值的引用,给左值取别名
   const 左值引用
   右值引用  右值引用:使用&&符号定义   编译器
   
  右值的生命周期一般只在当前语句  
   
移动
移动构造函数  nonexcept
移动运算符

#include <utility> std::move() std::forward()
   资源的所有权
   
###既有移动构造函数又有拷贝构造函数 
 函数的匹配的原则	
 
 定义了拷贝构造函数但未定义移动构造函数时,std::move会触发拷贝构造函数而非移动构造函数
 std::move 并不强制一个对象进行移动操作,而是将对象的引用转换为右值引用,
    这使得编译器能够选择执行移动构造函数(如果有的话)或者退而使用拷贝构造函数(如果没有合适的移动构造函数)。
 
成员函数--提供移动版本和拷贝版本

拷贝和移动

虽然技术上你可以定义一个接受非常量引用的拷贝构造函数,
但在实际编程中,使用常量引用参数的拷贝构造函数更为常见和推荐。const
  这样可以确保代码的安全性和效率,同时减少不必要的副作用	
posted @ 2025-05-02 22:01  辰令  阅读(17)  评论(0)    收藏  举报