Wie wirkt sich std :: launder auf Container aus?

Betrachten Sie die folgende vereinfachte und unvollständige Implementierung eines Vektors mit fester Größe:

template<typename T>
class Vec {
  T *start, *end;

public:
  T& operator[](ssize_t idx) { return start[idx]; }

  void pop() {
    end--;
    end->~T();
  }

  template<typename... U>
  void push(U... args) {
    new (end) T { std::forward<U>(args)... };
    end++;
  }
};

Betrachten Sie nun das folgende T:

struct T {
  const int i;
};

Und der folgende Anwendungsfall:

Vec<T> v;
v.push(1);
std::cout << v[0].i;
v.pop();
v.push(2);
std::cout << v[0].i;

Der Indexoperator verwendet dasstart Zeiger, um auf das Objekt zuzugreifen. Das Objekt an diesem Punkt wurde von @ zerstöpop und ein anderes Objekt wurde an seinem Speicherort von @ erstelpush(2). Wenn ich die Dokumentation rund um @ lestd :: launder richtig, das bedeutet, dass das Verhalten vonv[0] in der Zeile darunter ist undefiniert.

Wie soll std :: launder verwendet werden, um diesen Code zu korrigieren? Müssen wir jedes Mal, wenn eine neue Platzierung verwendet wird, Start und Ende waschen? Gegenwärtige Implementierungen der stdlib scheinen Code zu verwenden, der dem oben angegebenen Code ähnelt. Ist das Verhalten dieser Implementierungen undefiniert?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage