C++11 通过右值引用返回如何工作?

C++11 通过右值引用返回如何工作?,c++11,rvalue-reference,C++11,Rvalue Reference,就在我认为我理解右值引用的时候,我遇到了这个问题。代码可能太长了,但想法很简单。有一个main()函数和一个returnRValueRef()函数 #include <iostream> #define NV(x) "[" << #x << "=" << (x) << "]" #define log(x) cout << __FILE__ << ":" << __LINE__ << "

就在我认为我理解右值引用的时候,我遇到了这个问题。代码可能太长了,但想法很简单。有一个main()函数和一个returnRValueRef()函数

#include <iostream>

#define NV(x) "[" << #x << "=" << (x) << "]"
#define log(x) cout << __FILE__ << ":" << __LINE__ << " " << x << endl

using namespace std;

class AClass {
 public:
  int a_;

  AClass() : a_(0) {
    log("inside default constructor");
  }
  AClass(int aa) : a_(aa) {
    log("inside constructor");
  }
  int getInt() const {
    return a_;
  }
  void setInt(int a) {
    a_ = a;
  }

  AClass(AClass const & other) : a_(other.a_) {
    log("inside copy constructor");
  }

  AClass & operator=(AClass const & rhs) {
    log("inside assignment operator" << "left value" << NV(a_) << "right value" << NV(rhs.a_));
    a_ = rhs.a_;
    return *this;
  }

  AClass & operator=(AClass && rhs) {
    log("inside assignment operator (rvalue ref)" << "left" << NV(a_) << "right" << NV(rhs.a_));
    a_ = rhs.a_;
    return *this;
  }
};

AClass && returnRValueRef() {
  AClass a1(4);
  return move(a1);
}

int main() {
  AClass a;
  a = returnRValueRef();
}
有人能解释一下为什么输出中的最后一行打印的是
right[rhs.a_=0]
而不是
right[rhs.a_=4]
?我认为move()只是将左值转换为右值,而不改变其内容。但我显然遗漏了一些东西

非常感谢您的帮助。:-)


编辑:我想我知道可能发生了什么。可能是函数
returnRValueRef()
a1
的析构函数,当它超出范围时被调用(即使它被转换为右值),之后
a1
(或它的右值引用)的内存位置包含未定义的内容!不确定这是否是正在发生的事情,但似乎是有道理的

右值引用仍然是引用。在本例中,您引用的是已被破坏的局部变量。因此,访问成员是未定义的行为。您要做的是返回对象:

AClass returnRValueRef() {
  AClass a1(4);
  return move(a1);
}
但是,移动是使用局部变量自动进行的,因此您只需执行以下操作:

AClass returnRValueRef() {
  AClass a1(4);
  return a1;
}

谢谢你的评论。在你添加评论的同时,我也编辑了这个问题,似乎你所说的就是问题所在。谢谢(很抱歉,我无法对你的答案进行投票,因为分数太少。)有没有一个通过右值引用返回有用的例子?似乎不是吗(
AClass returnRValueRef() {
  AClass a1(4);
  return a1;
}