移动语义和完美转发是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 属 性,因为另一个新的