MSVC Klammerinitialisierung mit Doppelten scheint den Standard zu verletzen?

Überprüfen Sie dieses einfache Programm:

int main() {
    float f2 = 7.2; // OK, with warning
    float f3 = 7.199999809265137; // OK, no warning
    float f4{ 7.2 }; // Fails
    float f5{ 7.199999809265137 }; // OK, no warning
    float f6 = { 7.2 }; // Fails
    float f7 = { 7.199999809265137 }; // OK, no warning
}

Wenn mit MSVC 2015 unter Verwendung der Standardoptionen kompiliert cl /W4, Version 19.00.23918) erhalte ich die folgenden Meldungen:

FloatTest.cpp(2): warning C4305: 'initializing': truncation from 'double' to 'float'
FloatTest.cpp(4): error C2397: conversion from 'double' to 'float' requires a narrowing conversion
FloatTest.cpp(4): warning C4305: 'initializing': truncation from 'double' to 'float'
FloatTest.cpp(6): error C2397: conversion from 'double' to 'float' requires a narrowing conversion
FloatTest.cpp(6): warning C4305: 'initializing': truncation from 'double' to 'float'

Dieses Programm funktioniert einwandfrei mit Clang 3.0-3.8 und GCC 4.5.4-6.1.0 (getestet mithttp: //melpon.org/wandbo), mit nur Warnungen für nicht verwendete Variablen. Weiteres Entfernen / Auskommentieren von Zeilenf4 undf6 führt zu einer erfolgreichen Kompilierung (mit nur einer Warnung für Zeilef2).

Anfänglich scheint mir MSVC nur zu sagen, dass 7.2 nicht genau als @ dargestellt werden kanfloat, daher handelt es sich um eine Verengungskonvertierung (die bei der Initialisierung von geschweiften Klammern nicht zulässig ist). Der Standard draft N3337), Abschnitt 8.5.4, Anmerkung 7, sagt dies:

A Konvertierung einschränken ist eine implizite Konvertierung ...

vonlong double zudouble oderfloat oder vondouble zufloat, außer wenn die Quelle ein konstanter Ausdruck ist und der tatsächliche Wert nach der Konvertierung innerhalb des Wertebereichs liegt, der dargestellt werden kann even wenn es nicht genau dargestellt werden kann)

Emphasis Mine. Da 7.2 innerhalb des durch @ darstellbaren Wertebereichs liefloat, seine Umwandlung infloat sollte keine einschränkende Konvertierung nach dem Standard sein. Ist MSVC hier falsch und sollte ich einen Fehler melden?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage