gpt4 book ai didi

C++11: "narrowing conversion inside { }"带模数

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:55:02 24 4
gpt4 key购买 nike

我尝试在启用 gccC++11 的情况下编译以下代码:

unsigned int id = 100;
unsigned char array[] = { id % 3, id % 5 };

我收到这些警告:

narrowing conversion of ‘(id % 3u)’ from ‘unsigned int’ to ‘unsigned char’ inside { } [-Wnarrowing]

see demo online

有没有办法帮助编译器发现 id % 3 的结果适合 unsigned char

最佳答案

在这种特定情况下,使 id constconstexpr将解决问题:

constexpr unsigned int id = 100;

因为当您有一个转换后的结果适合目标类型的常量表达式时,这是一个异常(exception)。

在更一般的情况下,您还可以使用 static_cast将结果转换为无符号字符:

{ static_cast<unsigned char>( id % 3), static_cast<unsigned char>( id % 5) }
^^^^^^^^^^^ ^^^^^^^^^^^

我们可以在 draft C++ standard 中找到常量表达式 和缩小转换的异常8.5.4 List-initialization 部分说:

A narrowing conversion is an implicit conversion

并包括以下项目符号(强调我的):

  • from an integer type or unscoped enumeration type to an integer type that cannot represent all the values of the original type, except where the source is a constant expression whose value after integral promotions will fit into the target type.

请注意,由于 defect report 1449,措辞从最初的 C++11 标准草案更改为我在上面引用的内容.

关于C++11: "narrowing conversion inside { }"带模数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26974775/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com