Visual Studio 2015
编译器错误C2397中可以找到该主题的最新版本。
从'type_1'转换为'type_2'需要缩小转换
使用统一初始化时发现隐式缩小转换。
C语言允许在赋值和初始化时隐式缩小转换,并且C ++也可以适用,即使意外缩小是导致许多代码错误的原因。 为了使代码更安全,当初始化列表中出现缩小转换时,C ++标准需要诊断消息。 在Visual C ++中,使用从Visual Studio 2015开始支持的统一初始化语法时,诊断为编译器错误C2397。编译器在使用Visual Studio 2013支持的列表或聚合初始化语法时生成编译器警告(级别1)C4838 。
如果知道转换值的可能范围可以适合目标,缩小转换就可以。 在这种情况下,你比编译器知道的更多。 如果您故意进行缩小转换,请使用静态转换明确您的意图。 否则,这个错误信息几乎总是表明你的代码中有一个错误。 您可以通过确保初始化的对象具有足够大的类型来处理输入来修复它。
以下示例生成C2397并显示解决该问题的一种方法:
// C2397.cpp - C ++缩小转换诊断
//通过使用:cl / EHsc C2397.cpp进行编译
#include <vector>
struct S1 {
int m1;
double m2, m3;
};
void function_C2397(double d1) {
char c1 { 127 }; // OK
char c2 { 513 }; // error C2397
std::vector<S1> vS1;
vS1.push_back({ d1, 2, 3 }); // error C2397
//d1表示double 类型
std :: vector <S1> vS1;
vS1.push_back({d1,2,3}); //错误C2397
//如果你知道d1总是适合int,那么可能的修正
vS1.push_back({static_cast <int>(d1),2,3});
}
编译器错误C2397中可以找到该主题的最新版本。
从'type_1'转换为'type_2'需要缩小转换
使用统一初始化时发现隐式缩小转换。
C语言允许在赋值和初始化时隐式缩小转换,并且C ++也可以适用,即使意外缩小是导致许多代码错误的原因。 为了使代码更安全,当初始化列表中出现缩小转换时,C ++标准需要诊断消息。 在Visual C ++中,使用从Visual Studio 2015开始支持的统一初始化语法时,诊断为编译器错误C2397。编译器在使用Visual Studio 2013支持的列表或聚合初始化语法时生成编译器警告(级别1)C4838 。
如果知道转换值的可能范围可以适合目标,缩小转换就可以。 在这种情况下,你比编译器知道的更多。 如果您故意进行缩小转换,请使用静态转换明确您的意图。 否则,这个错误信息几乎总是表明你的代码中有一个错误。 您可以通过确保初始化的对象具有足够大的类型来处理输入来修复它。
以下示例生成C2397并显示解决该问题的一种方法:
// C2397.cpp - C ++缩小转换诊断
//通过使用:cl / EHsc C2397.cpp进行编译
#include <vector>
struct S1 {
int m1;
double m2, m3;
};
void function_C2397(double d1) {
char c1 { 127 }; // OK
char c2 { 513 }; // error C2397
std::vector<S1> vS1;
vS1.push_back({ d1, 2, 3 }); // error C2397
//d1表示double 类型
std :: vector <S1> vS1;
vS1.push_back({d1,2,3}); //错误C2397
//如果你知道d1总是适合int,那么可能的修正
vS1.push_back({static_cast <int>(d1),2,3});
}