更新时间:2024-01-22 12:18
右值引用(及其支持的移动语义Move semantics和完美转发Perfect forwarding)是C++11中加入的最重大语言特性之一。
在C++98中,临时量(术语为右值,因其出现在赋值表达式的右边)可以被传给函数,但只能被接受为const &类型。这样函数便无法区分传给const &的是真实的右值还是常规变量。而且,由于类型为const &,函数也无法改变所传对象的值。C++0x将增加一种名为右值引用的新的引用类型,记作typename &&。这种类型可以被接受为非const值,从而允许改变其值。这种改变将允许某些对象创建转移语义。比如,一个std::vector,就其内部实现而言,是一个C式数组的封装。如果需要创建vector临时量或者从函数中返回vector,那就只能通过创建一个新的vector并拷贝所有存于右值中的数据来存储数据。之后这个临时的vector则会被销毁,同时删除其包含的数据。有了右值引用,一个参数为指向某个vector的右值引用的std::vector的转移构造器就能够简单地将该右值中C式数组的指针复制到新的vector,然后将该右值清空。这里没有数组拷贝,并且销毁被清空的右值也不会销毁保存数据的内存。返回vector的函数现在只需要返回一个std::vector<>&&。如果vector没有转移构造器,那么结果会像以前一样:用std::vector<> &参数调用它的拷贝构造器。如果vector确实具有转移构造器,那么转移构造器就会被调用,从而避免大量的内存分配。
考虑到安全因素,具名变量即使被声明为右值类型也不会被当作右值。如需把它当作右值,须使用库函数
出于右值引用定义的本质特征以及某些对左值引用(常规引用)定义的修改,现在右值引用允许程序员提供函数参数的完美转发。当与模板变参相结合时,这种能力可以允许函数模板完美地将参数转发给接受那些参数的其他函数。这在转发构造器参数时尤为有用:可以创建一些能自动调用具有相应参数构造器的工厂函数。C++语言一直具有常量表达式的概念。这些诸如3+4之类的表达式总是产生相同的结果且不具备副作用。常量表达式给编译器带来了优化的可能,而编译器也经常在编译期执行此类表达式并将结果存放在程序中。