我有一个结构,其工厂方法定义如下:
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); };
};
在Visual Studio 2015中使用以下代码:
EvalValue function test() {
long long a = 0;
return EvalValue::fromNumber(a);
}
导致警告:
警告C4244:'参数':转换自' __ int64'要“重复”,可能会丢失数据
编译器显然采用了错误的方法,因为我有long long
的专用变体。这种行为的原因是什么?毋庸置疑,这在没有警告的情况下在clang和gcc中运行良好。
答案 0 :(得分:0)
没有编译器是对的。您应该调用fromInt
,因为它的数据类型与long long匹配。如果你在命令中点击-Wall,gcc也会发出警告。