美文网首页
右值引用、std::move()

右值引用、std::move()

作者: Myth52125 | 来源:发表于2017-11-07 20:26 被阅读0次

参考文章

模板参数的右值引用形参

template <typename T>
void f5(T&&);

当函数是一个模板函数的时候,当他的形参是右值引用的时候有如下的不同:

传入左值,传入值的类型被推断为类型的引用
比如,传入string类型,那么T被推断为string&
同时,引用折叠:怎么说,意思就是左值引用的引用就等于引用,也是是,所有的双数引用可以折叠为右值引用。
而所有单数的引用可以折叠为左值引用

T&& && &&=T&&
T&& && && & =T&

因此,综上棉量两点:
当T = string &&是,传入的参数类型为string& &&,因此被折叠为string &。
这就是模板函数的右值引用形参可以接受一个左值的原因。

普通函数的右值引用形参

stl大量的使用了type_traits技术来提取参数类型

例如std::move()

template <class _Ty>
inline constexpr typename remove_reference<_Ty>::type &&
move(_Ty &&_Arg) _NOEXCEPT
{ // forward _Arg as movable
    return (static_cast<typename remove_reference<_Ty>::type &&>(_Arg));
}

remove_reference<_Ty>

template <class _Ty>
struct remove_reference
{ // remove reference
    typedef _Ty type;
};

template <class _Ty>
struct remove_reference<_Ty &>
{ // remove reference
    typedef _Ty type;
};

template <class _Ty>
struct remove_reference<_Ty &&>
{ // remove rvalue reference
    typedef _Ty type;
};

因此remove_reference能够根据传入参数的不同,在其typedef _Ty type中萃取出传入的类型。
std::move中的static_cast<typename remove_reference<_Ty>::type &&>(_Arg)进行类型转换。

步骤是:根据传入的参数,萃取出参数的类型,然后转化为参数的右值引用类型。

编译器行为

现在的编译器基本上都会做返回值优化(return value optimization)。也就是说,编译器会在函数返回的地方直接创建对象,而不是在函数中创建后再复制出来。很明显,这比move语义还要好一点。

这也就是为什么有的时候,栈参数的地址比函数内对象的地址还要低。因为要返回的对象被直接创建在返回值处。

相关文章

  • ★18.关于右值引用与完美转发

    右值引用 无名右值引用 无名右值引用是右值。 无名右值引用的产生方式: std::move和std::forwar...

  • std::move

    std::move函数可以以非常简单的方式将左值引用转换为右值引用。通过std::move,可以避免不必要的拷贝操...

  • 右值引用、std::move()

    参考文章 模板参数的右值引用形参 当函数是一个模板函数的时候,当他的形参是右值引用的时候有如下的不同: 传入左值,...

  • 一文看懂 C++11 的 右值引用、std::move 和 st

    右值引用、std::move 和 std::forward 是 C++11 中的最重大语言新特性之一。就算我们不主...

  • 就TM你叫std::forward啊?

    之前介绍过std::move,今天我们就接着来说说std::forward。C++11引入了一个新特性:右值引用,...

  • 智能指针

    std::unique_ptr<> 初始化:直接初始化、右值赋值、std::move作为函数返回值作为函数形参

  • 右值,右值引用,move

    问题构造函数接受一个unique_ptr的参数。 如果是定义一个unique_ptr然后直接传入,会报错。像这样。...

  • 左值右值引用和移动构造

    左值与右值 左值引用右值引用 C++ 11中用&表示左值引用,用&&表示右值引用 (move函数可以把一个) 进...

  • [C++11阅读]移动语义和完美转发(下)

    移动语义 右值引用与移动构造函数结合,可以起到无拷贝所有权转移的效果。C++11的标准库中的std::move()...

  • 右值引用小结

    今天总结下右值的那些事儿 什么是右值 右值的必要性 move函数 什么是右值 传统c++的引用就是左值引用,使得标...

网友评论

      本文标题:右值引用、std::move()

      本文链接:https://www.haomeiwen.com/subject/jcqsmxtx.html