0

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

   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仍在工作的分配初始化背后的基本原理。

4

1 回答 1

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

这是一个聚合初始化

从上面的参考:

聚合初始化的效果是:

...

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


quint8 x = COMMAND_WRITE_MISC_CONFIG | i;

这是一个复制初始化

从上面的参考:

复制初始化的效果是:

...

否则(如果 T 和 other 的类型都不是类类型), 则使用标准转换,如有必要,将 other 的值转换为 T 的 cv 非限定版本。

它至少应该允许缩小转换以实现向后兼容性。

于 2017-01-08T17:01:48.167 回答