Yog*_*rma 7 rvalue-reference c++11
就在我认为我理解rvalue引用的时候,我遇到了这个问题.代码可能不必要地长,但这个想法很简单.有一个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();
}
Run Code Online (Sandbox Code Playgroud)
好的,我希望这段代码首先打印"内部默认构造函数"(对于a),然后"内部构造函数"(对于a1),然后使用rhs.a_ = 4赋值运算符消息.但是输出是
testcpp/return_rvalue_ref.cpp:14 inside default constructor
testcpp/return_rvalue_ref.cpp:17 inside constructor
testcpp/return_rvalue_ref.cpp:39 inside assignment operator (rvalue ref)left[a_=0]right[rhs.a_=0]
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么输出中的最后一行打印right[rhs.a_=0]而不是right[rhs.a_=4]?我认为move()只是将左值变为右值而不改变其内容.但我显然遗漏了一些东西.
非常感谢你的帮助.:-)
编辑:我想我知道可能会发生什么.可能是a1函数的析构函数returnRValueRef()在超出作用域时被调用(即使它被转换为rvalue),之后a1(或它的rvalue引用)的内存位置包含未定义的东西!不确定这是不是发生了什么,但似乎有道理.
Vau*_*ato 18
右值参考仍然是参考.在您的情况下,您正在引用已被破坏的局部变量.因此,访问成员是未定义的行为.你想要做的是返回对象:
AClass returnRValueRef() {
AClass a1(4);
return move(a1);
}
Run Code Online (Sandbox Code Playgroud)
但是,移动会自动发生局部变量,因此您只需要执行此操作:
AClass returnRValueRef() {
AClass a1(4);
return a1;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
903 次 |
| 最近记录: |