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 に答える