c++ - 为什么显式构造被视为(隐式)缩小转换?

标签 c++ g++ language-lawyer clang++ narrowing

考虑以下代码:

uint32_t foo(uint64_t x ) {
    auto y = uint32_t { x };
    return y;
}

它被认为是缩小转换,编译器认为有必要警告我(GCC 9),甚至声明错误(clang 9):GodBolt .

我的问题:

  1. 为什么是uint32_t { x }static_cast<uint32_t>(x) 不太明确?
  2. 为什么 clang 比 GCC 更严重,值得出错?

最佳答案

Why is uint32_t { x } less explicit than static_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/

相关文章:

c++ - g++ 编译器中的 “Uninitialized use” 警告

c++ - 无法将字符串与 "y"进行比较

c++ - 为什么没有透明的 C++1x std::map::at?

c++ - 如何在 C++ NodeJS Addon 中使用 V8::AddMemoryAllocationCallback 方法

c++ - 一段时间后Qt框架消失

c++ - 如何(重新)在文件中间写入字节?

c++ - 部分专注于错误类型的非类型模板参数

c++ - operator[] 的奇怪行为

c++11 - cygwin g++ std::stoi "error: ‘stoi’ 不是“std”的成员

c++ - 为什么(仅)某些编译器对相同的字符串文字使用相同的地址?