看板 C_and_CPP 關於我們 聯絡資訊
考慮下列程式 void test_sizeof() { struct A{}; sizeof(A()); } //in VC 2008 & 2010 //error C2066: cast to function type is illegal //in GCC 4.5 //warning: invalid application of 'sizeof' to a function type 由錯誤訊息來看,compiler 把 sizeof(A()) 當成 function type 於是我改寫這樣的 code void test_sizeof() { struct A(){ public: A(int a=0){} }; sizeof(A(0)); } compiler 可以順利通過。 我在網路上找了一些資料,有個 hack 方式可以讓第一種方式順利編過 http://erdani.com/errata/display.html?book_index=1&printing=13&book_name=Modern%20C++%20Design void test_sizeof() { struct A{}; sizeof((A())); // 多加括號 } 我的問題是,為什麼多加了這一對括號就可以讓 VC compiler Happy 呢 XD 謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.134.96.34
ilway25:我前幾天念 Modern C++ Design 才遇到一模一樣的問題= = 12/06 12:59
littleshan:struct A(){} 這是啥寫法?而且也編不過 12/06 13:00
※ 編輯: spider391 來自: 220.134.96.34 (12/06 13:40)
spider391:已經更正為 struct A{}; 謝謝 12/06 13:40
littleshan:這道理就跟你寫 A x(); 這樣 x 會被當成 function 12/06 15:22
littleshan:在要放type的地方寫A()會被當成是回傳A的function 12/06 15:23
littleshan:但多加括號後compiler把它視為一個expression 12/06 15:24
littleshan:因此會把 A() 當成是建構 A 的 ctor 12/06 15:25
loveme00835:不用讀 Modern C++ Design 就遇得到這問題了阿 :) 像 12/06 17:23
loveme00835:是 std::vector 的傳入兩個迭代器版本的建構子, 也會 12/06 17:24
loveme00835:讓編譯器以為是函式宣告 12/06 17:24
spider391:謝謝說明^^ 12/06 17:44
hilorrk:我記得primer上的例子就是love大的那個XD 12/07 01:07
hilorrk:還是more effective? 有點忘了... 12/07 01:08
tinlans:建構子的案例,在 Effective STL 很前面的 Item。 12/07 14:37
tinlans:Item 6,PDF 檔直接 Google 書名就有了。 12/07 14:38