Werfen Sie einen Blick auf diese Code-Schnipseltemporäre Objekt Verwirrung
struct S{ int i; int j;};
int main()
{
assert(S().i == S().j) // is it guaranteed ?
}
Warum?
Werfen Sie einen Blick auf diese Code-Schnipseltemporäre Objekt Verwirrung
struct S{ int i; int j;};
int main()
{
assert(S().i == S().j) // is it guaranteed ?
}
Warum?
ist es garantiert?
Ja, es ist garantiert. Die Werte von S().i
und S().j
wären 0
. ()
impliziert value initialization. (das bedeutet i
und j
wäre Null initialisiert, weil S
ist eine Klasse ohne Konstruktor Benutzer definierten Standard)
Von C++ Norm ISO/IEC 14882: 2003 (E) Punkt 3.6.2
Objekte mit statischer Speicherdauer (3.7.1) müssen auf Null initialisiert werden (8.5), bevor eine andere Initialisierung stattfindet.
Das ist also gültig, da beide Variablen Null initialisiert sind.
Ich sehe hier kein Objekt mit statischer Speicherbelegung. Ausdruck 'S()' erzeugt ein ** temporäres Objekt ** lokal für den Geltungsbereich von 'assert()'. –
Sie möchten Abschnitt 8.5, der den allgemeinen Fall der Initialisierung behandelt. – birryree
Entschuldigung ... irgendwie dachte ich, dass er die globale Variable –
Technisch, ja. Sie werden auf 0
initialisiert (zumindest unter einem Nicht-Debug-Build für die meisten Compiler. Der Visual Studio-Compiler initialisiert normalerweise nicht initialisierte Variablen mit einem bestimmten Muster in Debug-Builds)
.
Wenn Sie jedoch in einer Codeüberprüfung sitzen, seien Sie nicht überrascht, wenn Sie dafür angebrüllt werden, Ihre Variablen nicht explizit zu initialisieren.
verwendet, die garantiert null ist. Wegen der Klammern(). –
Wow !!!! Danke vielmals. – Bollinger
Insbesondere wird das Hinzufügen von 'S() {}' (ein do-nothing benutzerdefinierter ctor) zu "struct S" dazu führen, dass "i" und "j" nicht initialisiert bleiben, was bedeutet, dass 'assert()' wahrscheinlich ist auslösen. –
Yup right [.....] –