【C++11新概念】:右值引用

C语言原始定义:在C语言中表示位于赋值运算符两侧的两个值,左边的就叫左值,右边的就叫右值。

左值:

地址,内存中的具体空间,可以被读写;例如变量

左值指的是如果一个表达式可以引用到某一个对象,并且这个对象是一块内存空间且可以被检查和存储

右值:

数据,例如1,‘哈哈哈哈’

右值指的是引用了一个存储在某个内存地址里的数据。不能通过引用或指针读写。用户无法控制这个右值。

一个区分左值和右值的方法是:能不能对这个值取地址。

历史:

在C++03中,临时变量(右值,出现在等号右侧的变量。另一种解释是引用值,没有实际地址的值)和const & type没有实际的差别。而在C++0X标准中添加了一种新的引用类型。叫做右值引用。它的定义类似于typename &&。另外右值引用提供了一种转移语义。

移动语义:

右值引用构造时:是将传进来的参数的内存直接转移到构造出来的对象里,并将参数对象置为空。

return语句:

按照以前C的说法,return语句如果是按值传递的话,return语句会把一个值复制一份再传递出去,那么对对象来说,复制就只能通过对象的赋值构造函数来实现了。

右值引用:

关键字: &&

int && a = 10;

右值引用为一个非常量右值的引用。

当调用右值引用的类并没有定义右值引用构造函数时,默认的拷贝构造函数会被调用,并且参数会以const &的形式传入。

左值引用:

关键字:&

左值引用为一个左值的引用。

右值引用的作用:

为了解决C++一个非常著名的性能问题-----拷贝临时对象。

如果我们知道一个对象是非常量右值,那我们在进行临时变量的拷贝时,就可以不用拷贝实际的数据(调用拷贝构造函数时不复制数据),而是‘窃取’指向这个对象的指针。(move转移)

右值引用不能引用一个左值对象,为了可以对指定的左值对象进行右值引用操作。标准库提供了std::move()函数。

当调用右值引用的类并没有定义右值引用构造函数时,默认的拷贝构造函数会被调用,并且参数会以const &的形式传入。

为了便于在模板中进行参数推到,标准库提供了std::forward()函数通过此函数可以保证传入参数的左右值性质不变

右值引用,std::move(),std::forward()用法msdn例子:

template <class T, class A1>
inline
shared_ptr<T>
factory(A1&& a1)
{
    // If a1 is bound to an lvalue, it is forwarded as an lvalue
    // If a1 is bound to an rvalue, it is forwarded as an rvalue
    return shared_ptr<T>(new T(forward<A1>(a1)));
}

struct A
{
    ...
    A(const A&);  // lvalues are copied from
    A(A&&);       // rvalues are moved from
};

int main()
{
    A a;
    shared_ptr<A> sp1 = factory<A, A>(a);        // "a" copied from
    shared_ptr<A> sp2 = factory<A, A>(move(a));  // "a" moved from
}
forward<A1>(a1):保证传进来的变量左右值性质不变,如果传入 a1 的值最初为右值或右值引用,则返回对 a1 的右值引用;否则,返回 a1,而不修改其类型.
move(a):返回左值对象的右值引用forward:
forward 使得编译器能够在得知转发的参数的原始类型后执行重载决策。转发函数的实际参数的表面类型可能不同于其原始类型,例如,当右值用作函数的实际参数并绑定到形式参数名称时;拥有名称可使其成为左值,而无论该值是否作为右值实际存在。  forward 将还原实际参数的右值状态。完美转发:

还原参数原始值的右值状态以执行重载决策被称为“完美转发”。

通过完美转发,模板函数可接受任一引用类型的参数,并在必要时还原其右值状态以执行正确的重载决策。通过使用完美转发,你可以保留右值的移动语义,而且无需提供仅根据其参数的引用类型而变化的函数的重载。

现在定义了右值引用构造函数的类:

STL:std::vector

原文链接: https://www.cnblogs.com/yiii/p/5299071.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/230458

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 下午2:42
下一篇 2023年2月13日 下午2:42

相关推荐