在赋值和初始化列表之间缩小C ++ 11的差异

时间:2017-01-08 16:44:12

标签: c++ c++11 initializer-list narrowing

C ++ 11为我们提供了初始化列表。我已经了解到这些不会执行缩小转换,这有时会破坏现有代码的编译,例如在使用隐式内部扩展值的枚举值操作时:

   enum COMMAND
   {
     COMMAND_WRITE_MISC_CONFIG = 0x70
   };


   struct CommandSettings
   {
     quint8 buddy;
   };


   void NarrowingTest::testNarrowing()
   {
     quint8 i = 100;
     CommandSettings test{static_cast<quint8>(COMMAND_WRITE_MISC_CONFIG | i)};
     quint8 x = COMMAND_WRITE_MISC_CONFIG | i;
     QVERIFY(true);
   }      

如果没有强制转换,test的初始化将无法编译。

我正在寻找的是x分配初始化背后的基本原理。

1 个答案:

答案 0 :(得分:1)

CommandSettings test{static_cast<quint8>(COMMAND_WRITE_MISC_CONFIG | i)};

这是aggregate initialization

从上面的参考文献:

  

聚合初始化的影响是:

     

...

     

如果initializer子句是表达式,则隐式转换为   允许按照复制初始化, ,除非它们正在缩小 (如   在列表初始化中)(自C ++ 11起)

quint8 x = COMMAND_WRITE_MISC_CONFIG | i;

这是copy initialization

从上面的参考文献:

  

复制初始化的效果是:

     

...

     

否则(如果T和其他类型都不是类类型),   如有必要,使用标准转化来转换价值   除了cv-nonqualified version of T之外。

它应该允许缩小转换次数,至少是为了向后兼容。