将双精度值分配给 int 数组时的类型转换
Type conversion when assigning a double to an int array
我正在学习C++,遇到了一些我想了解更多的事情。
假设我尝试将数组声明并初始化为:
int myarray[] = {1, 2, 3, 4.1};
请注意索引 3 处的非整数 4.1。在Visual Studio中,这将编译并显示警告,但在gcc中将无法编译。当将错误的类型分配给数组的元素时,标准(对于 11、14 或 17(是否有关于自动转换的任何内容,还是由编译器决定会发生什么(或其他事情(?我想找出为什么结果不同。
C++11
之前,代码是合法的。由于C++11
这被认为是狭义的转换(从double
到int
存在信息丢失(并且是非法的。
您使用什么编译器和什么版本的编译器很重要。Visual Studio,尤其是稍旧的版本,实际上并没有完全实现任何标准。他们实现了C++11
位、C++14
位、C++17
位。对于可能已经更改的最新版本,我最近没有关注它的演变。
真正旧版本的 gcc 默认为gnu++98
,这与 gnu 扩展C++98
,而较新版本默认为 gnu++11 和 gnu++14。出于您的好奇心,如果您想看到它在 gcc 中使用-std=c++98
,您只会收到警告。
事后看来,我们已经了解到,允许可能丢失信息的隐式转换(例如,从浮点到整数,从long long
到int
(不是一个好主意。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
- 声明C++具有动态大小的数组类型在 Linux 中工作正常,但不能在 Windows 中工作
- 数组类型 int[n][n] 不可赋值,因为表达式必须具有常量值
- 取消引用结束指针到数组类型的一个
- 结构化绑定初始值设定项表单 { 赋值表达式 } 对于 clang 上的数组类型失败
- 如何在数组类型的模板代码中计算std::size_t
- LLVM 无法将数组类型强制转换为常量数组
- 推荐的方法在不初始化值的情况下使数组类型为 std::unique_ptr?
- 特征:从数组类型中获取标量类型是否记录?
- T D[N] 总是声明数组类型的对象吗?
- 如何在模板中推断数组类型?
- 字符串文字到 char 数组的转换如何在C++中实际工作
- 重载常量和非常量转换运算符返回数组类型时出现 MSVC 错误 C2593
- 将非类非数组 prvalue 转换为符合 cv 条件的类型是否合法?
- 将Boost Multi_array转换为本机数组类型
- 用于递归模板求值的强制转换数组类型
- 将字符数组类型转换为结构体(不是类/对象)
- 在读取.csv时将数组类型字符串转换为double
- 可变模板函数将数组类型强制转换为指针
- 如何将 void 类型的元素转换为整数数组类型
- 在编译时将std::数组强制转换为另一种数据类型