【发布时间】:2019-01-15 08:50:17
【问题描述】:
让我们编译以下程序:
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 是在这里还是一个错误?
请注意,我的 sn-p 是最小的。例如,警告在以下情况下会消失:
- 从
3.14中删除f后缀,即改为double - 使用赋值而不是
|= - 删除
std::round - 缓存舍入结果:
const auto r = uint16_t(std::round(3.14f));,然后将其或分配给data。
【问题讨论】:
-
更小的示例(不需要标头和函数)是
short data(0); data |= short(float{3.0f}); -
@VTT 确实如此。在我的编译器上转载。
标签: c++ gcc language-lawyer