编译器错误 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
}