C++:std::move() / std::forward()

本文介绍了C++11中的移动语义和完美转发,包括std::move和std::forward的使用。移动语义通过std::move实现数据所有权的转移,而完美转发则通过std::forward保持实参的左右值属性,用于通用的模板函数。文章详细讲解了右值引用、static_cast和其他类型转换操作符,并探讨了在不同情况下的性能和使用注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

移动语义和完美转发是C++11中引入的两个重要技术。熟练的掌握移动语义与完美转发,有益于设计安全、高性能的程序。其头文件均为。
移动语义:增强了程序对数据所有权的控制,通过std::move标准库函数实现。
完美转发:为实现通用的模板函数奠定了基础。通过std::forward库函数实现。

基础1:右值引用
C++表达式有两个属性:类型和值类型。这里的“值类型”指的就是左值(lvalue)与右值(rvalue)。通俗地讲,可以取地址的表达式,是左值。不可以取地址的表达式,是右值。
注意:不能完全按照等号左右来区分左右值

int a = 2; // a:可以取地址,为左值
foo(std::string(“a”)); // std::string(“a”):临时创建的,无法取地址,为右值
std::string str(“a”);
foo(str); // str:可以取地址,为左值
int a = b * c; // b * c:结果是int类型,具备右值属性,在其被赋予a后,内存就会销毁。
std::string a = “hello”; // “hello”:lvalue;因为hello保存在常量区,可以取地址

左值引用:“类型+&”格式,如int&, std::string&
右值引用:“类型+&&”格式,如int&&,std::string&&

基础2:static_cast
C++通过引进四个新的类型转换操作符克服了 C 风格类型转换的缺点,这四个操作符是, static_cast, const_cast, dynamic_cast, 和 reinterpret_cast。
**static_cast:**功能上基本上与 C 风格的类型转换一样强大,含义也一样。它也有功能 上限制。例如,你不能用 static_cast 象用 C 风格的类型转换一样把 struct 转换成 int 类 型或者把 double 类型转换成指针类型,另外,static_cast 不能从表达式中去除 const 属 性,因为另一个新的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值