簡體   English   中英

分配列表和初始化列表在C ++ 11中縮小的差異

[英]Differences in narrowing in C++11 between assignment and initialiser lists

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賦值初始化仍然有效的背后原理。

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

這是一個聚合初始化

根據上面的參考:

聚合初始化的效果是:

...

如果initializer子句是一個表達式,則按復制初始化允許進行隱式轉換, 除非它們正在縮小 (如在列表初始化中)(自C ++ 11起)


quint8 x = COMMAND_WRITE_MISC_CONFIG | i;

這是一個副本初始化

根據上面的參考:

復制初始化的效果是:

...

否則(如果T或other的類型都不是類類型),則在必要時使用標准轉換將other的值轉換為T的cv不合格版本。

它至少應允許縮小轉換范圍,以實現向后兼容性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM