2016-06-06 22 views
-4

In C können Sie dies tun:Static const ohne initializer

static const int a; 

int main(){} 

Und es scheint in Ordnung zu sein. C99 §6.7.8p10 sagt:

Wenn ein Objekt, das statische Speicherdauer hat, ist ausdrücklich nicht initialisiert ist, dann:

- wenn es arithmetischen Typ hat, wird sie initialisiert (positiv oder unsigned) Null;

ähnlich C++ 14 §3.6.2p2 sagt:

Variables mit statischer Speicherdauer (3.7.1) oder Fadenspeicher Dauer (3.7.2) betragen Null initialisiert (8,5) bevor irgendeine andere Initialisierung stattfindet.

Der Unterschied ist in C++ 14 es einen Initialisierer §8.5p7 benötigt:

Wenn ein Programm für die Standard-Initialisierung eines Objekts ruft eines const qualifizierten Typ T, T wird Sei ein Klassentyp mit einem vom Benutzer bereitgestellten Standardkonstruktor .

Also ich frage, warum ist ein Initializer in C++ erforderlich? Es wird kein Initialisierer benötigt, wenn a nicht const ist, also welchen Unterschied macht const hier, das würde keinen Initialisierer schlecht machen?

+3

C und C++ sind verschiedene Sprachen. –

Antwort

0

Im allgemeinen Fall eines Klassentypobjekts kann die Nullinitialisierung möglicherweise kein gültiges Objekt ergeben. Und wenn eine solche Klasse keinen Standardkonstruktor hat, würde ein static const dieses Typs ohne einen Initialisierer ein ungültiges Objekt erzeugen.

Die aktuellen Regeln nur hinzufügen keine eine Ausnahme für Typen, bei denen Null-Initialisierung ist gut genug.

Eine zusätzliche Sprachfunktion zur Unterstützung von Nullkonstanten würde die Dinge komplizieren, ohne einen wirklichen Gewinn zu erzielen.

-1

C ist keine sehr sichere Sprache. In C ist für ein Objekt const kein Initialisierer erforderlich. Bedeutung Sie können dies tun:

int main() 
{ 
    const int a; 
} 

Hoppla. a hat automatische Speicherdauer, so dass es einen unbestimmten Wert hat. Und Sie können es später nicht ändern ...

Jetzt sagen wir, dass Sie diese Funktion erlaubt haben. Würde es Sinn machen? Anders als C hat C++ ein Konzept namens konstante Initialisierung, die manchmal anstelle von Null Initialisierung durchgeführt wird. Aber was erwarten Sie den Wert von a zu haben? Unbestimmter Wert? Es kann nicht Null sein, da wir gerade gesagt haben, dass das nicht passiert!

Wenn Sie a Null sein, dann nur sagen so.Verlassen Sie sich nicht auf implizite Regeln der Sprache, die (im Fall von C) inkonsistent sind. Das ist schlecht für die Lesbarkeit und Wartbarkeit.

+0

Die Frage bezieht sich auf eine Variable ** Dateibereich **, keine automatische Variable. Dateibereich 'int' Variablen werden auf 0 initialisiert, so dass das ganze Gespräch über unbestimmte Werte irrelevant ist. –