将双精度值分配给 int 数组时的类型转换

Type conversion when assigning a double to an int array

本文关键字:数组 类型转换 int 双精度 分配      更新时间:2023-10-16

我正在学习C++,遇到了一些我想了解更多的事情。

假设我尝试将数组声明并初始化为:

int myarray[] = {1, 2, 3, 4.1};

请注意索引 3 处的非整数 4.1。在Visual Studio中,这将编译并显示警告,但在gcc中将无法编译。当将错误的类型分配给数组的元素时,标准(对于 11、14 或 17(是否有关于自动转换的任何内容,还是由编译器决定会发生什么(或其他事情(?我想找出为什么结果不同。

C++11之前,代码是合法的。由于C++11这被认为是狭义的转换(从doubleint存在信息丢失(并且是非法的。

您使用什么编译器和什么版本的编译器很重要。Visual Studio,尤其是稍旧的版本,实际上并没有完全实现任何标准。他们实现了C++11位、C++14位、C++17位。对于可能已经更改的最新版本,我最近没有关注它的演变。

真正旧版本的 gcc 默认为gnu++98,这与 gnu 扩展C++98,而较新版本默认为 gnu++11 和 gnu++14。出于您的好奇心,如果您想看到它在 gcc 中使用-std=c++98,您只会收到警告。


事后看来,我们已经了解到,允许可能丢失信息的隐式转换(例如,从浮点到整数,从long longint(不是一个好主意。C++11考虑到了这一点。使所有这些隐式转换非法被认为是一个重大的改变。列表初始化的引入提供了一个中间立场:只允许在列表初始化中缩小转换范围,并建议使用列表初始化作为初始化对象的实际方式。缺点是,这是数组初始化的重大更改,但好处被加权为更有价值。

int a = 2.4;   // still allowed, but not recommended
int a(2.4);    // still allowed, but not recommended
int a = {2.4}; // New way to initialize. Narrowing conversion, illegal
int a{2.4};    // New and recommended way to initialize. Narrowing conversion, illegal

您可以在此处详细了解狭义转化:https://en.cppreference.com/w/cpp/language/list_initialization