[英]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.