Gelöschter Standardkonstruktor. Objekte können immer noch erstellt werden ... manchmal
Ich dachte, dass seit C ++ 11 benutzerdefinierte Typobjekte mit dem neuen @ erstellt werden sollt{...}
Syntax anstelle des alten(...)
Syntax (außer Konstruktor überladen fürstd::initializer_list
und ähnliche Parameter (z. B.std::vector
: Größe ctor vs 1 Element init_list ctor)).
Die Vorteile sind: keine impliziten Conversions, kein Problem mit der lästigsten Analyse, Konsistenz (?). Ich sah kein Problem, da ich dachte, dass sie gleich sind (außer dem angegebenen Beispiel).
Aber sie sind nicht.
ine Geschichte von purem WahnsiDas{}
ruft den Standardkonstruktor auf.
... Ausser wenn
der Standardkonstruktor wird gelöscht unds sind keine weiteren Konstruktoren definierSieht es dann so aus, als würde der Wert eher das Objekt initialisieren? ... Auch wenn das Objekt den Standardkonstruktor gelöscht hat, wird das{}
kann ein Objekt erstellen. Übertrifft dies nicht den gesamten Zweck eines gelöschten Konstruktors?
...Ausser wenn
das Objekt hat einen gelöschten Standardkonstruktor undandere (s) Konstruktor (en) definiert. Dann scheitert es mitcall to deleted constructor
.
...Ausser wenn
das Objekt hat einen gelöschten Konstruktor undkein anderer Konstruktor definiert undmindestens ein nicht statisches Datenelement.Dann schlägt es mit fehlenden Feldinitialisierern fehl.
Aber dann können Sie @ verwend{value}
, um das Objekt zu konstruieren.
Ok vielleicht ist dies die selbe wie die erste Ausnahme (Wert init das Objekt)
...Ausser wenn
die Klasse hat einen gelöschten Konstruktorund mindestens ein Datenmitglied in der Klasse ist standardmäßig initialisiert.Then noch{}
Noch{value}
kann ein Objekt erstellen.
ch bin sicher, ich habe ein paar verpasst. Die Ironie ist, dass es heißtUnifor Initialisierungssyntax. Ich sage nochmal:UNIFOR Initialisierungssyntax.
as ist das für ein Wahnsin
Scenario A Gelöschter Standardkonstruktor:struct foo {
foo() = delete;
};
// All bellow OK (no errors, no warnings)
foo f = foo{};
foo f = {};
foo f{}; // will use only this from now on.
Scenario B Standardkonstruktor gelöscht, andere Konstruktoren gelöschtstruct foo {
foo() = delete;
foo(int) = delete;
};
foo f{}; // OK
Scenario C Gelöschter Standardkonstruktor, andere Konstruktoren definiertstruct foo {
foo() = delete;
foo(int) {};
};
foo f{}; // error call to deleted constructor
Scenario D Gelöschter Standardkonstruktor, keine anderen Konstruktoren definiert, Datenelementstruct foo {
int a;
foo() = delete;
};
foo f{}; // error use of deleted function foo::foo()
foo f{3}; // OK
Scenario E Gelöschter Standardkonstruktor, gelöschter T-Konstruktor, T-Datenelementstruct foo {
int a;
foo() = delete;
foo(int) = delete;
};
foo f{}; // ERROR: missing initializer
foo f{3}; // OK
Scenario F Gelöschter Standardkonstruktor, Klasseninitialisierer von Datenelementenstruct foo {
int a = 3;
foo() = delete;
};
/* Fa */ foo f{}; // ERROR: use of deleted function `foo::foo()`
/* Fb */ foo f{3}; // ERROR: no matching function to call `foo::foo(init list)`