c++ - GCC 和 -Wconversion
问题描述
让我们编译以下程序:
int main()
{
uint16_t data = 0;
data |= uint16_t(std::round(3.14f));
return 0;
}
和g++ -Wconversion prog.cpp
我们会得到warning: conversion to ‘uint16_t {aka short unsigned int}’ from ‘int’ may alter its value
,但我在这里看不到隐式转换。
这种警告应该通过显式强制转换来静音,例如:
double d = 3.14;
float foo1 = d; // Warning
float foo2 = float(d); // No warning
float foo2 = static_cast<float>(d); // No warning
GCC 在这里还是一个错误?
请注意,我的片段是最小的。例如,警告在以下情况下消失:
- 从中删除
f
后缀3.14
,即制作它double
- 使用赋值而不是
|=
- 消除
std::round
- 缓存舍入结果:
const auto r = uint16_t(std::round(3.14f));
,然后将其或分配给data
.
解决方案
警告是虚假的。
对于每个三元组 ( L, VQ, R ),其中L是整数类型,VQ是易失的或空的,并且R是提升的整数类型,存在形式为 ...
VQ L& operator|=(VQ L&, R);
所以我们得到一个内置的unsigned short operator |=(unsigned short&, unsigned int);
给定表达式中没有隐式转换
uint16_t data = 0;
data |= uint16_t(std::round(3.14f));
推荐阅读
- javascript - Retrieving JSON depending on user input
- node.js - 将 Node 14 转换为旧版本的 Node 代码的最佳方法是什么?
- docker - Kubelet 在 NFS 持久卷中缓存文件的本地副本
- python - Manim - BrokenPipeError: [Errno 32] 断管
- java - REST Api - JSON - “无法反序列化 START_ARRAY 令牌中的对象实例”
- python - 转储到 JSON 时如何控制格式?
- sql - 从 Visual Studio 项目中读取 SQL 变量
- python - 将 sklearn 糖尿病数据集转换为 pandas DataFrame
- xml - 带有viewpager的布局底部的静态按钮
- c# - Azure WebJobs 从静态函数中访问配置