I have a piece of code to check if move happened.
struct Foo
{
  Foo() = default;
  Foo(Foo&& other) = default;
  double a[1000];
  double b[1000];
};
Foo giveMe()
{
  Foo ret;
  std::cout << &ret << std::endl;
  return ret;
}
int main()
{
  Foo o1 = giveMe();
  std::cout << &o1 << std::endl;
  return 0;
}
Well, it does not. The addresses of ret and o1 are, for instance, as follows:
008F7D78
008FBC08
However, after slight change in move constructor:
struct Foo
{
  Foo() = default;
  Foo(Foo&& other) {}
  double a[1000];
  double b[1000];
};
the addressees are the same:
010FBE28
010FBE28
What is happening here? I assume that this behaviour is somehow related to POD or trivial types but I am not sure how.