Erlaubt den Aufruf eines beliebigen Konstruktors für alle Array-Elemente

8

Nach einigen Nachforschungen sieht es so aus, als ob das Verhalten beim Initialisieren von Variablen einer Konvention folgt.

Für einzelnes Element:

%Vor%

Das macht viel Sinn, bis Sie versuchen, dieselbe Logik auf Arrays anzuwenden:

%Vor%

Meine Logik besagt, dass Sie einige Annahmen machen können:

  • Wenn ein Typ mit T(Args..) konstruiert werden kann, kann jedes Element aus dem Array konstruiert werden. Es gibt keinen Grund, T[N](Args...) syntax nicht zuzulassen.

Weiß jemand, warum diese Funktion nicht existiert? Es wäre sehr schön,

zu erlauben %Vor%

Bearbeiten: Die ganze Idee davon ist, die Standardinitialisierung / den Konstruktor zu vermeiden und die eine, die wir direkt brauchen, aufzurufen.

    
Ivan Sanz-Carasa 04.02.2018, 17:19
quelle

2 Antworten

4

Es wäre zwar schön, wenn es in der Standardbibliothek etwas dafür gäbe, aber die gewünschte Funktionalität lässt sich relativ einfach implementieren:

%Vor%

Online-Demo

Das heißt, ich sehe keinen Grund, hier Konstruktorargumente zu nehmen; container emplace functions sind nützlich, da sie eine perfekte Weiterleitung ausführen, aber das können wir hier nicht tun, weil wir die Argumente für jeden Konstruktoraufruf wiederverwenden müssen (daher ist das Verschieben von ihnen keine Option). Ich denke, Kopierkonstruktion ist natürlich:

%Vor%

Online-Demo

N.b. Ihre Verwendung von new impliziert, dass Sie möglicherweise aus einer verwalteten Sprache stammen und sich mit der Wertesemantik befassen müssen. ; -] Dieser Code könnte geändert werden, um eine std::array<T, N>* oder T* (oder sogar std::unique_ptr<T[]> für etwas angemessenes vernünftiges) zurückzugeben, aber warum sollte man ..? Verwenden Sie einfach std::vector<T> :

%Vor%

Ich habe hier std::array<> demonstriert, weil Ihre Beispiele alle eine konstante Größe haben.

Das nächste, was Ihnen einfällt, ist std::fill , aber das würde das Array nicht initialisieren ...

    
ildjarn 04.02.2018 17:50
quelle
3

Ich kann nicht für das Komitee sprechen, aber ich kann einen Fall sehen, in dem Ihre Syntax sehr sehr problematisch ist: Initialisierung von provisories: .

%Vor%

Wie gehen Sie mit diesem Fall um?

Sie können X(Y&&) (vorausgesetzt, dass es existiert) für jedes der 10 Elemente nicht aufrufen, weil Sie nur 1 temporär haben und alle Elemente nach dem ersten von einem Objekt in einem unspezifizierten Zustand initialisiert werden.

Die andere Alternative wäre, stattdessen X(const Y&) aufzurufen (vorausgesetzt, es existiert wieder). Abgesehen davon, den Standard zu verkomplizieren und unerwartet inkonsistentes Verhalten hinzuzufügen, das nur eine weitere Würmer-Dose öffnet. Das X -Objekt könnte eine Referenzbindung an unser Y{} haben, vorausgesetzt, es handelt sich um einen Lvalue, und Sie erhalten einen Dangling-Verweis.

Die einzige praktikable Lösung, die ich sehe, ist, keine rvalue-Verweise auf diese Syntax zuzulassen, aber das würde nur mehr SO-Fragen enthalten.

Ich denke, es ist ziemlich sicher anzunehmen, dass das Standardkomitee dies berücksichtigt.

    
bolov 05.02.2018 09:18
quelle

Tags und Links