看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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://www.ptt.cc/bbs/C_and_CPP/M.1491376251.A.F2C.html ※ 編輯: descent (113.196.174.254), 04/05/2017 16:30:35
loveflames: 又多了一個使用list initialization的好處,算是吧 04/05 16:58