¿Está permitido llamar al destructor explícitamente seguido de una nueva ubicación en una variable con una vida útil fija?

Sé que llamar a destructor explícitamente puede conducir a un comportamiento indefinido debido a la llamada de doble destructor, como aquí:

#include <vector>

int main() {
  std::vector<int> foo(10);
  foo.~vector<int>();
  return 0;  // Oops, destructor will be called again on return, double-free.
}

Pero, ¿qué pasa si llamamos a la ubicación nueva para "resucitar" el objeto?

#include <vector>

int main() {
  std::vector<int> foo(10);
  foo.~vector<int>();
  new (&foo) std::vector<int>(5);
  return 0;
}

Más formalmente:

Lo que sucederá en C ++ (estoy interesado en C ++ 03 y C ++ 11, si hay una diferencia) si llamo explícitamente a un destructor en algún objeto que no se construyó con una ubicación nueva en primer lugar (p. Ej. es una variable local / global o se asignó connew) y luego, antes de que este objeto se destruya, llame a la ubicación nueva para "restaurarlo".Si está bien, ¿está garantizado que todas las referencias no constantes a ese objeto también estarán bien, siempre que no las use mientras el objeto esté "muerto"?Si es así, ¿está bien usar una de las referencias no constantes para una ubicación nueva para resucitar el objeto?¿Qué pasa con las referencias constantes?

Ejemplo de caso de uso (aunque esta pregunta es más sobre curiosidad): quiero "reasignar" un objeto que no tieneoperator=.

He vistoesta pregunta que dice que el objeto "de anulación" que tiene no estáticaconst Los miembros son ilegales. Entonces, limitemos el alcance de esta pregunta a los objetos que no tienenconst miembros.

Respuestas a la pregunta(2)

Su respuesta a la pregunta