C++11: “narrowing conversion inside { }” with modulus

后端 未结 4 1546
梦如初夏
梦如初夏 2020-12-04 02:32

I try to compile the following code with gcc and C++11 enabled:

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


        
4条回答
  •  [愿得一人]
    2020-12-04 02:36

    In this specific case making id const or constexpr will fix the problem:

    constexpr unsigned int id = 100;
    

    since there is an exception for the case where you have a constant expression whose result after conversion will fit into the target type.

    In the more general case you may also use static_cast to cast the result to unsigned char:

    { static_cast( id % 3), static_cast( id % 5) }
      ^^^^^^^^^^^                          ^^^^^^^^^^^
    

    We can find he exception for constant expressions and narrowing conversions in the draft C++ standard section 8.5.4 List-initialization which says:

    A narrowing conversion is an implicit conversion

    and include the following bullet (emphasis mine):

    • 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.

    Note, the wording changed from the original draft C++11 standard to what I quote above due to defect report 1449.

提交回复
热议问题