作者descent (「雄辯是銀,沉默是金」)
看板C_and_CPP
標題[問題] narrowing conversion
時間Wed Apr 5 15:10:36 2017
開發平台(Platform): (Ex: Win10, Linux, ...)
linux 64bit
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
g++
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
no
問題(Question):
#include <typeinfo>
#include <iostream>
using namespace std;
class A
{
public:
A(long a)
{
cout << a << endl;
}
};
int main(int argc, char *argv[])
{
/* aa */ A a{0xffff0000};
// 會有 error: narrowing conversion of '4294901760u' from
'unsigned int' to 'long int' inside { } [-Wnarrowing]
/* bb */ A a(0xffff0000); // 可以正確編譯
}
0xffff0000 的 type 是 unsigned int, 我使用 -m32 編譯出 x86 32bit 程式碼。
從 unsigned int to long (x86 32bit 環境), 應該會有 narrowing conversion
的錯誤, 可是使用 bb 的語法, 就不會有這樣的錯誤訊息。
我猜測 bb 的語法做了 implicit conversion, 但 aa 那個語法是怎麼處理的呢?
編譯指令:
g++ -m32 -std=c++14 b.cpp -o b
當然如果是在 x86 64 環境, 沒有任何問題, long 是 64bit, 可以裝得下
unsigned int。
補充:
查到了, {} 語法不允許 narrowing conversion。
c++ 標準庫 p15
--
紙上得來終覺淺,絕知此事要躬行。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 113.196.174.254
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1491376251.A.F2C.html
※ 編輯: descent (113.196.174.254), 04/05/2017 16:30:35
1F:推 loveflames: 又多了一個使用list initialization的好處,算是吧 04/05 16:58