Los requisitos de copia / movimiento para los tipos de clave / valor en un std :: map?

Este código me confunde:

struct foo {
  int i;

  foo(int j) : i(j) {}

  foo(const foo &) = delete;
  foo(foo &&) = delete;
  foo &operator=(const foo&) = delete;
  foo &operator=(foo&&) = delete;
};

bool operator<(const foo &f1, const foo &f2)
{
  return f1.i < f2.i;
}

int main(int argc, char **argv)
{
  std::map<foo,int> f;
  std::map<foo,int> f2 = f; //error (as expected)
  std::map<foo,int> f3 = std::move(f); //no error (why?)
  return 0;
}

Debido a que no obtengo ningún error allí, parece que al mover un mapa no se crea ningún objeto clave (ni siquiera para mover otro objeto clave).

Por qué no? ¿Puedo confiar en este comportamiento según el estándar C ++ 11?

De manera más general, ¿qué requisitos de copia / movimiento hace unstd::map colocar en eltipos de clave y valor y bajo que condiciones?

Respuestas a la pregunta(2)

Su respuesta a la pregunta