ich eine Struktur mit Factory-Methoden wie folgt definiert haben:Falsche statische Methode Auflösung in Visual C++
struct EvalValue
{
enum ValueType { Float, Int, Null, NotNull } type; // NULL and NOT NULL are possible literals, so we need an enum for them.
double number;
EvalValue (ValueType aType, double aNumber) : type(aType), number(aNumber) {}
static EvalValue fromBool(bool value) { return EvalValue(Int, value ? 1 : 0); };
static EvalValue fromNumber(double number) { return EvalValue(Float, number); };
static EvalValue fromInt(long long number) { return EvalValue(Int, (double)number); };
};
Verwendung des folgenden Codes in Visual Studio 2015:
EvalValue function test() {
long long a = 0;
return EvalValue::fromNumber(a);
}
auf die Warnung führt:
Warnung C4244: 'Argument': Konvertierung von '__int64' zu 'double', möglicher Datenverlust
Der Compiler übernimmt eindeutig die falsche Methode, da ich eine dedizierte Variante für long long
habe. Was ist der Grund für dieses Verhalten? Unnötig zu sagen, dass dies ohne Vorwarnung in clang und gcc funktioniert.
OMG wie peinlich, danke. –
Kein Problem. Ich mache schlimmere Fehler. Es ist nur ein Mangel an Aufmerksamkeit für einige Sekunden und Dinge laufen schief. – user902384
Upvote? Antwort annehmen? Ich habe vor, Jon Skeet zu schlagen. : D – user902384