Visual c++ msvc2010中左值移动是否已中断/未完成?
我不知道为什么这个代码不起作用。该值显示为0xCCCC,v不再为4。为什么? 注意:我试图使用左值/移动语义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
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构造转换为移动构造。我将编辑我的评论,以减少误导。