我不知道为什么这段代码不起作用。这显示为0xcccccccc,v不再是4.为什么?
注意:我正在尝试使用左值/移动语义。
struct AA{
void*this_;
int v;
AA() {v=4;this_=this; }
AA(AA&a){this_=this; }
AA(AA&&a){
this_=a.this_;
v = a.v;
}
};
void movetest(AA s) {}
void movetest(AA& s) {}
//void movetest(AA&& s) {}
AA&& movetest() { return AA(); }
void MyTestCode2(){
AA c = movetest();
printf("wron value. 4 !='%d'\n", c.v);
}
答案 0 :(得分:3)
那是返回对本地的引用。它应该是
AA movetest() { return AA(); }
此代码要求存在移动或复制构造函数,但MSVC将使用返回值优化而不实际调用。一般来说,你应该设计你的对象,好像移动或复制发生在你的控制之外 - 只需保持对象的一致状态,不要依赖它们的副作用。
VC2010正好更喜欢移动复制,例如在调试版本
上AA movetest() { AA a; 返回; }
调用AA(AA&&)构造函数而不是AA(AA&)构造函数。
答案 1 :(得分:1)
额外信息:由于格式问题,这是一个答案,而不是评论。
警告会很好,但语言不需要。尝试通过AA&返回本地左值看看你是否收到警告。
clang ++为您的代码提供以下警告:
test.cpp:14:26: warning: returning reference to local temporary object
AA&& movetest() { return AA(); }
^~~~