赞
踩
左值可以取地址、位于等号左边;而右值没法取地址,位于等号右边。在C++中右值指的的临时值或常量,更准确的说法是保存在CPU寄存器中的值为右值,而保存在内存中的值为左值。
左值引用,标志是&,能指向左值,不能指向右值;右值引用,标志是&&,顾名思义,右值引用专门为右值而生,可以指向右值,不能指向左值。
从move的实现看,实际上std::move就是一个类型转换器,将左值转换成右值。
- template <typename T>
- typename remove_reference<T>::type&& move(T&& t)
- {
- return static_cast<typename remove_reference<T>::type&&>(t);
- }
所以说std::move是一个非常有迷惑性的函数,它并不能把一个变量里的内容移动到另一个变量,事实上std::move移动不了什么,唯一的功能是把左值强制转化为右值,让右值引用可以指向左值。
所以,概括来说:
在实际场景中,右值引用和std::move被广泛用于在STL和自定义类中实现移动语义,避免拷贝,从而提升程序性能。
- std::string createResource() {
- std::string tempSrc = "Very large string";
- // 其他操作
- return std::move(tempSrc);
- }
- class MyClass {
- public:
- // 移动构造函数
- MyClass (MyClass && other) noexcept : data(std::move(other.data)) {
- // 其他资源的转移操作
- }
-
- // 移动赋值运算符
- MyClass & operator=(MyClass && other) noexcept {
- if (this != &other) {
- data = std::move(other.data);
- // 其他资源的转移操作
- }
- return *this;
- }
-
- private:
- std::vector<int> data;
- };
- std::vector<std::string> sourceVec = {"apple", "pear", "watermelon"};
-
- // 将 sourceVec 的元素移动到 targetVec, 移动后sourceVec 不再拥有原有的元素
- std::vector<std::string> targetVec;
- for (auto&& element : sourceVec)
- {
- targetVec.push_back(std::move(element));
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。