gpt4 book ai didi

c++ - 将局部变量声明为右值引用是否无用,例如T&& r = move (v)?

转载 作者:IT老高 更新时间:2023-10-28 12:58:19 25 4
gpt4 key购买 nike

你们能不能给我一个在特定情况下的说明性例子来证明以下陈述是有用和必要的?

AnyTypeMovable   v;
AnyTypeMovable&& r = move(v);

最佳答案

不,AnyTypeMovable&& r = move(v);这里一点用处都没有。

考虑以下代码:

#include <iostream>
#include <vector>

class MyMovableType
{
int i;
public:
MyMovableType(int val): i(val){}
MyMovableType(MyMovableType&& r) { this->i = r.i; r.i = -1; }
MyMovableType(const MyMovableType& r){ this->i = r.i; }
int getVal(){ return i; }
};

int main()
{
std::vector<MyMovableType> vec;
MyMovableType a(10);
MyMovableType&& aa = std::move(a);

vec.push_back(aa);

std::cout << a.getVal() << std::endl;

return 0;

}

作为 aa是左值(如 R. Martinho FernandesXeo 所述 - 命名的右值引用是左值),这将打印 10表示没有执行 move (在赋值中也没有,在push_back调用中也没有),所以你仍然需要std::movepush_back方法,如本例所示:

#include <iostream>
#include <vector>

class MyMovableType
{
int i;
public:
MyMovableType(int val): i(val){}
MyMovableType(MyMovableType&& r) { this->i = r.i; r.i = -1; }
MyMovableType(const MyMovableType& r){ this->i = r.i; }
int getVal(){ return i; }
};

int main()
{
std::vector<MyMovableType> vec;
MyMovableType a(10);
MyMovableType&& aa = std::move(a);

vec.push_back(std::move(aa));

std::cout << a.getVal() << std::endl;

return 0;

}

将执行 move ,因此打印输出将是 -1 .所以,尽管你正在传递 aapush_back ,你仍然需要通过std::move .

关于c++ - 将局部变量声明为右值引用是否无用,例如T&& r = move (v)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18766324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com