C++11 学习笔记(11) std::move 右值引用 初识

std::move

参考链接:
c++ 右值引用 原文
详解C++右值引用
std::move
std::remove_reference
value_categary

例子:
int i = 101;
auto j = std::move(i);

Visual Studio 2013 的源码

其含义是 获取其参数的右值(rvalue)引用, 并转变为另一个 xvalue.

关于 C++ value 的文章 可以了解 左值 右值等概念.

std::move 封装 std::remove_reference
对 remove_refrence 的可能实现:

template< class T > struct remove_reference {typedef T type;};
template< class T > struct remove_reference<T&> {typedef T type;};
template< class T > struct remove_reference<T&&> {typedef T type;};

即返回引用的真实类型, 将 _Arg转换为其真实的类型(字面意思就是去掉引用)

其返回值即 static_cast::type&&>(t)

使用场景:
即 i 可能在之后并不会被用到, 而为了减少开销, i右值时, 直接将 i的资源提供给j, 和j资源交换或者不作为,
即 j原来的资源指针被被交换, 减少了临时变量的这一步开销.

如果是 int j = i; // i 有名字的int, 作为左值, 为了减少开销, 即当做右值处理 std::move(i) 可以扩展为:

// 此时 _Ty 为 int, 强制作为右值参数传入
typename remove_reference::type&& move(int &&i) _NOEXCEPT
{
return ((typename remove_reference::type&&)i);
}

j 赋值后 i的值就变得不可预测, 也不建议使用. 例如将 int 改为 std::string 操作调试较为明显:
尤其是 std::string 操作:
std::string i = “hello”;
std::string j = std::move(i); // 不能保证i之后草做是否正常, 做了与 i=”hello” 一样的构造函数操作, 传入的是右值,而非左值.

i = “hello”; // 中
调用到 assign操作, “hello” 作为右值, 从代码上可以发现, 使用了转发语义.
其赋值即 i 先会释放掉自己的资源 , 然后 “hello”所在资源地址交给了i

原创文章,转载请注明: 转载自kaka_ace's blog

本文链接地址: C++11 学习笔记(11) std::move 右值引用 初识

发表评论

电子邮件地址不会被公开。 必填项已用*标注