#include <iostream>
#include <string>
#include <tuple>

struct A
{
  A() = default;
  A(const A&) { std::cout << "copied" << std::endl; }
  A(A&&) { std::cout << "moved" << std::endl; }
};

std::pair<A, A> get_pair()
{
  std::cout << "in get_pair():" << std::endl;
  std::pair<A, A> p;
  return p;
}

std::tuple<A, A> get_tuple()
{
  std::cout << "in get_tuple():" << std::endl;
  std::pair<A, A> p;
  return p;
}

std::tuple<A, A> get_tuple_moved()
{
  std::cout << "in get_tuple_moved():" << std::endl;
  std::pair<A, A> p;
  return std::move(p);
}

int main(int, char*[])
{
  get_pair();
  get_tuple();
  get_tuple_moved();
}
