编译器错误 C2397

从“type_1”到“type_2”的转换需要收缩转换

使用统一初始化时发现了隐式收缩转换。

C 语言允许在赋值和初始化中进行隐式收缩转换,C++ 也是如此,尽管许多代码错误会导致意外收缩。 为使代码更安全,C++ 标准要求在初始化列表发生收缩转换时提供诊断消息。 在 Visual C++ 中,当使用从 Visual Studio 2015 开始支持的统一初始化语法时,诊断结果为编译器错误 C2397。 使用 Visual Studio 2013 支持的列表或聚合初始化语法时,编译器生成编译器警告(级别 1) C4838

如果你清楚可能范围的转换值适合目标,则可以进行收缩转换。 在这种情况下,你比编译器了解得更多。 如果你有意进行收缩转换,请使用静态强制转换来明确意图。 否则,此错误消息几乎总是指示代码中存在 bug。 确保初始化的对象具有足以处理输入的类型,从而修复此错误。

以下示例生成 C2397:

// C2397.cpp
// compile with: /c
struct S {
   int m1;
   double m2, m3;
};

void func(double d1) {
   char c1 { 127 };   // OK
   char c2 { 513 };   // C2397
   
   S arr[2]{};
   arr[0] = { d1, 2.0, 3.0 };   // C2397
   arr[1] = { static_cast<int>(d1), 2.0, 3.0 };   // OK
}