zoukankan      html  css  js  c++  java
  • C++ Primer 笔记——理解std::move

    标准库move函数是使用右值引用的模板的一个很好的例子。标准库是这样定义std::move的:

    template <typename T>
    typename remove_reference<T>::type&& move(T&& t)
    {
        return static_cast<typename remove_reference<T>::type&&>(t);
    }

    我们考虑如下代码的工作过程:

    std::string s1("hi"), s2;
    s2 = std::move(string("hi"));    // 正确,从一个右值移动数据
    s2 = std::move(s1);                // 正确,但是在赋值之后,s1的值是不确定的


    在第一个赋值中,实参是string类型的右值,因此过程为:

    • 推断T的类型为 string
    • remove_reference<string> 的 type 成员是 string
    • move 返回类型是 string&&
    • move 的函数参数t的类型为 string&&

    因此,这个调用实例化 move<string>,即函数

    string&& move(string &&t)


    在第二个赋值中,实参是一个左值,因此:

    • 推断T的类型为 string&
    • remove_reference<string&> 的 type 成员是 string
    • move 返回类型是 string&&
    • move 的函数参数t的类型为 string& &&,会折叠成 string&

    因此,这个调用实例化 move<string&>,即

    string&& move(string &t)

      通常情况下,static_cast 只能用于其他合法的类型转换。但是有一条针对右值的特许规则:虽然不能隐式的将一个左值转换成右值引用,但我们可以用static_cast显示的将一个左值转换为一个右值。

  • 相关阅读:
    Invalid bound statement (not found)解决方法
    MySQL的sum()函数
    关于Mybatis的java.lang.UnsupportedOperationException异常处理
    博客迁移
    Building Blog(个性化博客)2
    走一波服务器
    JZ高中OJ 1036. [SCOI2009]迷路
    JZ初中OJ 2296. [noip普及组2]神殿
    JZ初中OJ 2295. [noip普及组2]栈
    JZ初中OJ 2298. [noip普及组2]异或
  • 原文地址:https://www.cnblogs.com/zoneofmine/p/7440577.html
Copyright © 2011-2022 走看看