Visual c++ msvc2010中左值移动是否已中断/未完成?

Visual c++ msvc2010中左值移动是否已中断/未完成?,visual-c++,c++11,Visual C++,C++11,我不知道为什么这个代码不起作用。该值显示为0xCCCC,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) {} voi

我不知道为什么这个代码不起作用。该值显示为0xCCCC,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);
}

这是返回对本地服务器的引用。应该是

AA movetest() { return AA(); }
此代码需要存在move或copy构造函数,但MSVC将使用返回值优化,而不是实际调用这两个构造函数。一般来说,您应该将对象设计为在您的控制之外进行移动或复制——只需保持对象的一致状态,不要依赖它们的副作用

VC2010正确地倾向于移动到复制,例如在调试版本上

AA测试() { AA a; 返回a; }


调用AA(AA&&)构造函数而不是AA(AA&)构造函数。

该构造函数返回对本地构造函数的引用。应该是

AA movetest() { return AA(); }
此代码需要存在move或copy构造函数,但MSVC将使用返回值优化,而不是实际调用这两个构造函数。一般来说,您应该将对象设计为在您的控制之外进行移动或复制——只需保持对象的一致状态,不要依赖它们的副作用

VC2010正确地倾向于移动到复制,例如在调试版本上

AA测试() { AA a; 返回a; }


调用AA(AA&&)构造函数而不是AA(AA&)构造函数。

额外信息:这是一个答案,而不是注释,只是因为格式问题

警告是很好的,但是语言不需要警告。尝试通过AA返回一个本地左值&看看是否得到警告

clang++为您的代码提供以下警告:

test.cpp:14:26: warning: returning reference to local temporary object
AA&& movetest() { return AA(); }
                         ^~~~

额外信息:这是一个答案而不是评论,只是因为格式问题

警告是很好的,但是语言不需要警告。尝试通过AA返回一个本地左值&看看是否得到警告

clang++为您的代码提供以下警告:

test.cpp:14:26: warning: returning reference to local temporary object
AA&& movetest() { return AA(); }
                         ^~~~

使用该解决方案,AA&&永远不会被调用。我通过编写
a=a.v+1
进行测试,所以我的日志应该打印5。但无论如何,我如何在函数中使用左值?编辑了我的答案,以显示使用std::move强制移动构造,从我看到的我需要强制转换AA&&或使用std::move(这是一个强制转换,但在删除引用之后)。return AA()似乎是优化的(这是调试模式)。它不调用复制构造函数。如果我写AA a它会的;重新运行a;。所以我不明白为什么(至少在visualc++中)AA&&不是一个错误/警告,如果对象在处理之前超出范围+1和ACCEPETEDI在
return std::move(AA())
中使用
std::move
std::move
的整个要点实际上是启用“从左值到右值”的转换,但这里已经有了右值。它将一个非常好的RVO构造转换为移动构造。我将编辑我的评论以减少误导。有了这个解决方案,AA&&永远不会被调用。我通过编写
a=a.v+1
进行测试,所以我的日志应该打印5。但无论如何,我如何在函数中使用左值?编辑了我的答案,以显示使用std::move强制移动构造,从我看到的我需要强制转换AA&&或使用std::move(这是一个强制转换,但在删除引用之后)。return AA()似乎是优化的(这是调试模式)。它不调用复制构造函数。如果我写AA a它会的;重新运行a;。所以我不明白为什么(至少在visualc++中)AA&&不是一个错误/警告,如果对象在处理之前超出范围+1和ACCEPETEDI在
return std::move(AA())
中使用
std::move
std::move
的整个要点实际上是启用“从左值到右值”的转换,但这里已经有了右值。它将一个非常好的RVO构造转换为移动构造。我将编辑我的评论,以减少误导。