是否在msvc2010中通过左值/未完成移动?

时间:2011-04-08 07:41:05

标签: visual-c++ c++11

我不知道为什么这段代码不起作用。这显示为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);
}

2 个答案:

答案 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(); }
                         ^~~~