考虑以下代码:
uint32_t foo(uint64_t x ) {
auto y = uint32_t { x };
return y;
}
它被认为是缩小转换,编译器认为有必要警告我(GCC 9),甚至声明错误(clang 9):GodBolt .
我的问题:
- 为什么是
uint32_t { x }
比static_cast<uint32_t>(x)
不太明确? - 为什么 clang 比 GCC 更严重,值得出错?
最佳答案
Why is
uint32_t { x }
less explicit thanstatic_cast<uint32_t>(x)
?
这并不是不明确,而是不允许。进行直接或复制列表初始化时不允许缩小转换。当你这样做时auto y = uint32_t { x };
您正在直接列表初始化 y
并缩小转换范围。 (保证复制省略意味着这里不再有临时的)
Why is this more severe with clang than with GCC, meriting an error?
这取决于实现者。显然 clang 想要更严格并发出硬错误,但两者都很好。该标准仅要求给出诊断消息,警告或错误涵盖了这一点。
关于c++ - 为什么显式构造被视为(隐式)缩小转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59828426/