C++ 在包含std::string成员的结构上使用移动语义

C++ 在包含std::string成员的结构上使用移动语义,c++,c++11,move,stdstring,C++,C++11,Move,Stdstring,这个问题可能很琐碎,但我还没有找到任何相关的答案。我的示例代码: #include <iostream> struct ExampleStruct { int a; std::string b; double c; }; ExampleStruct&& getExampleStruct() { ExampleStruct obj; obj.a = 1; obj.b = std::string("asdf"); obj.c = 1.43;

这个问题可能很琐碎,但我还没有找到任何相关的答案。我的示例代码:

#include <iostream>

struct ExampleStruct {
  int a;
  std::string b;
  double c;
};

ExampleStruct&& getExampleStruct() {
  ExampleStruct obj;
  obj.a = 1;
  obj.b = std::string("asdf");
  obj.c = 1.43;

  return std::move(obj);
}

int _tmain(int argc, _TCHAR* argv[]) {
  ExampleStruct&& moved_obj = getExampleStruct();

  // moved_obj.a == 1
  // moved_obj.b == ""
  // moved_obj.c == 1.43

  return 0;
}
#包括
结构示例结构{
INTA;
std::字符串b;
双c;
};
ExampleStruct&&getExampleStruct(){
示例结构对象;
目标a=1;
obj.b=std::string(“asdf”);
目标c=1.43;
返回标准::移动(obj);
}
int _tmain(int argc,_TCHAR*argv[]{
ExampleStruct&&moved_obj=getExampleStruct();
//移动对象a==1
//已移动对象b==“”
//移动对象c==1.43
返回0;
}

为什么
moved\u obj.b
被清空,而
moved\u obj.a
moved\u obj.c
保持不变?

如何清空
int
double
?返回对局部变量的引用。访问
moved_obj
中的任何内容都是未定义的行为。将右值分配给基本类型的语义是复制该值。Mat,我相信使用std::move(C++11)语义返回对右值的引用会延长对象的生存期,我错了吗?@igleyy[class.temporary]/5“临时绑定到函数返回语句中返回值的生存期不会延长;在return语句中的完整表达式末尾销毁临时表达式。”