2017-05-17 4 views
3

Ich habe über die Verengung Konvertierung auf der cpp Referenz Website gelesen. Ich habe es irgendwie verstanden, aber was ich nicht verstehe ist, warum ist der Fehler nur in der ersten Zeile vorhanden.Verengung Konvertierung während der Initialisierung der Liste erforderlich

long double ld = 3.1415926536; 
    int a{ld}, b = {ld}; // error: narrowing conversion required 
    int c(ld), d = ld; // ok: but value will be truncated 

Warum ist der Fehler nur in der ersten Zeile vorhanden und nicht die zweite?

+0

Denken Sie daran, dass eine einheitliche Initialisierung ein neueres Konzept ist. Es wurde im Nachhinein entwickelt. Bedenken Sie auch, dass es nicht trivial ist, das Verhalten von althergebrachten Mechanismen zu ändern. –

Antwort

3

Da der Compiler benötigt ist ein diagnostische auszustellen (in Ihrem Fall Fehler) zum Verengen nur für list initialization (a.k.a. einheitliche Initialisierung), ist ausgehend von C++ 11. Für die Initialisierung vor C++ 11 ohne geschweifte Klammern ist keine Diagnose erforderlich.

Weitere Details finden Sie in der Dokumentation cppreference.com.

Siehe auch this answer, warum der Compiler nur eine Warnung ausgeben muss, nicht unbedingt ein Fehler.

+0

Beachten Sie, dass die meisten Compiler Optionen/Flags haben, die aktiviert werden können, was dazu führt, dass sie * auch * eine Diagnose zur Eingrenzung von Konvertierungen des Pre-C++ 11 Formulars ausgeben - wenn Sie dies wünschen (für gcc wäre das '-Wngarrowing')). –

+0

@JesperJuhl Guter Punkt! – vsoftco

+0

Dies ist nicht nur mit neuer Syntax. 'int a [] = {ld};' war gültig C++ 03, wurde aber in C++ 11 ungültig. – hvd

Verwandte Themen