首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将局部变量声明为rvalue-reference是无用的吗,例如T&& r= move(v)?

将局部变量声明为rvalue-reference是无用的吗,例如T&& r= move(v)?
EN

Stack Overflow用户
提问于 2013-09-12 21:57:57
回答 2查看 3.8K关注 0票数 29

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

代码语言:javascript
复制
AnyTypeMovable   v;
AnyTypeMovable&& r = move(v);
EN

回答 2

Stack Overflow用户

发布于 2013-09-12 22:16:20

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

考虑以下代码:

代码语言:javascript
复制
#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是一个l值(正如R. Martinho FernandesXeo所指出的那样-一个命名的rvalue-reference是一个左值),这将输出10,指示移动尚未执行(也不是在赋值中,也不是在push_back调用中),因此您仍然需要将其std::movepush_back方法,如下例所示:

代码语言:javascript
复制
#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。因此,尽管您正在将aa传递给push_back,但您仍然需要通过std::move传递它。

票数 13
EN

Stack Overflow用户

发布于 2013-09-13 00:51:31

请注意,命名的右值是左值。所以你应该使用std::forward。

代码语言:javascript
复制
#include <iostream>
#include <vector>

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

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

        vec.push_back( std::forward<decltype(a)>(aa) );

        std::cout << a.getVal() << std::endl; // -1 printed.

        return 0;

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18766324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档