【发布时间】:2019-04-11 18:01:45
【问题描述】:
带代码:
#include <cstdint>
uint8_t a() { return 5; }
auto b() {
uint8_t c = 6;
c |= a(); // Warning here
return c;
}
auto d() {
uint8_t c = 6;
uint8_t d = a();
c |= d;
return c;
}
g++ 警告(使用 -Wconversion):
<source>:7:12: warning: conversion from 'int' to 'uint8_t' {aka 'unsigned char'} may change value [-Wconversion]
我假设问题与位操作的整数提升有关,但在第二个函数 d() 中,我首先将它分配给一个变量,然后没有警告。
(clang 不会对此发出警告,只有 g++)
- 可以通过强制转换而不是变量赋值来解决这个问题吗?
- 为什么我使用函数时它的行为会有所不同?
具有上述内容的编译器资源管理器:https://godbolt.org/z/q9eMVT
【问题讨论】:
-
对我来说这看起来像是一个 gcc 错误 - 警告是虚假的。当该行被重写为语义等效的
c = c | a;时,相同的 gcc 不会发出警告。 -
hmm 没有警告 here 使用 gcc 8.3
-
啊,没有警告,因为我忘记了
-Wconversion
标签: c++ gcc bit-manipulation operators