当移动语义与std :: move一起使用时?

时间:2015-11-10 15:25:08

标签: c++ c++11 move-semantics

此示例中移动语义如何工作:

struct test {
    int ii[10];
    int i;
};

test f() {
    test a;
    std::cout << "[1] " << &a << std::endl;
    return a;
}

int main()
{
  test x (f());
  std::cout << "[2] " << &x << std::endl;
  test x1 (std::move(x));
  std::cout << "[3] " << &x1;
}

输出:

[1] 0x7fff50ac70c0
[2] 0x7fff50ac70c0
[3] 0x7fff50ac70f0

为什么x是使用f()的返回值构造的,但是x1的地址与x不同?

修改

struct test {
  std::string s;
}

[...]

std::cout << (*void)&x.s[0];

我想我最终都明白了。现在地址是一样的。

1 个答案:

答案 0 :(得分:5)

这与移动语义没有任何关系。 ax具有相同的内存地址,因为副本为Using "Next" as a Return Key,因此f的返回直接在呼叫站点分配。 x1x的地址不同,因为它是一个单独的对象,并且单独的对象不能具有相同的地址。移动不会改变地址,它允许将对象的内容撕掉并将其转移到移动的对象中。