视觉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); };
};

使用Visual Studio 2015中的以下代码:

EvalValue function test() {
  long long a = 0;
  return EvalValue::fromNumber(a);
}

导致警告:

警告C4244:'参数':从'__int64'到" double",可能丢失数据

的转换

编译器显然正在采用错误的方法,因为我对long long有一个专用的变体。这种行为的原因是什么?不用说这在Clang和GCC中可以很好地工作。

没有编译器正确。您应该调用fromInt,因为它具有与长长匹配的数据类型。如果您在命令中击中-Wall,GCC也会发出警告。

最新更新