首页 > 解决方案 > 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 在这里还是一个错误?

请注意,我的片段是最小的。例如,警告在以下情况下消失:

标签: c++gcclanguage-lawyer

解决方案


警告是虚假的。

根据[over.built]/22

对于每个三元组 ( 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));

推荐阅读