Ok, d.h. dein
T ist also irgendein Class-Type mit non-trivial Default C'tor!? Denn ansonsten sollte die Default-Initialization der Arrayelemente eine NOP sein. In dem Fall ist mir aber unklar inwiefern die "Lösungen" deines Vorgängers nicht das gleiche Problem haben...
Hast du schon versucht, statt
resize() und dann Elementzugriff, einen leeren
std::vector zu machen, per reserve den notwendigen Platz zu holen und dann per
push_back() deine Daten einzufüllen? Rein prinzipiell ist das Problem halt, dass so etwas wie ein "Array von nichtkonstruierten
T Objekten" rein semantisch keinen Sinn macht. Wenn du einen Haufen
T Objekte haben willst, um mit denen was zu machen, brauchst du erstmal einen Haufen
T Objekte. Du kannst uninitialisiertem Speicher nicht einfach einen
T-Wert zuweisen, sowas würde dem Konzept "Typ" an sich widersprechen; du kannst nur einem
T-Wert einen neuen
T-Wert zuweisen, sofern der Typ
T eine solche Zuweisung definiert. Was du machen kannst, ist in uninitialisiertem Speicher ein
T zu konstruieren. Das ist konzeptionell aber etwas völlig anderes da dabei neue Objekte erzeugt werden und nicht vorhandene modifiziert.
Edit: Ah OK, der Standard schreibt also tatsächlich vor dass
std::make_unique() Arrays value-initialized, war mir nicht bewusst; aber gut zu wissen, muss ich einiges an eigenem Code anpassen...dann also:
Code: Alles auswählen
template <typename T>
inline auto make_default(std::enable_if_t<std::is_array_v<T> && std::extent_v<T> == 0, std::size_t> N)
{
return std::unique_ptr<T> { new std::remove_extent_t<T>[N] };
}
// ...
auto data = make_default<T[]>(size);