看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: Win10, Linux, ...) http://rextester.com/l/cpp_online_compiler_gcc 在這地方測試的 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) gcc 問題(Question): http://codepad.org/3WjlxLGF f((string)FOO<int,int>()); 上面這行編譯不過 但只用隱式轉型時沒問題 強制轉基本型別也可以(但要稍微改一下code) 如果casting operator不以template方式使用,例如指定string型別 則允許強制轉型成string 想請教有人知道原因嗎 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.236.69.127 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1509351057.A.E9F.html ※ 編輯: loveflames (36.236.69.127), 10/30/2017 16:11:21
CoNsTaR: 你這樣子是在建構 FOO<int,int>,不是在呼叫 operator U 10/30 18:30
CoNsTaR: 欸 10/30 18:30
CoNsTaR: 還是現在 c++17 又有什麼神奇的新規定了嗎 10/30 18:32
CoNsTaR: 喔喔… 是我腦殘了 XDD 10/30 18:34
loveflames: 我的原始目的是模擬偏特化函數模板,想嘗試看看functo 10/30 18:58
loveflames: r以外的方法 10/30 18:58
loveflames: costructor缺點是無法回傳,所以想了一個轉型的解法 10/30 18:59
loveflames: 至於17,是有一個ctor參數推導模板參數的新規定,類 10/30 19:01
loveflames: 似函數那樣 10/30 19:01
CoNsTaR: template <typename T> T foo = (T)FOO<int,int>().opera 10/30 19:18
CoNsTaR: tor T(); f(foo<string>); 10/30 19:18
CoNsTaR: 這樣編譯可以過欸,完全不知道原因… 10/30 19:19
CoNsTaR: 感覺是編譯器的型別推論有問題? 10/30 19:22
CoNsTaR: 不過不只 gcc,clang 也這樣真的滿奇怪的 10/30 19:22
loveflames: VC++的行為也是一樣 10/30 19:26
notBeing: 因為 explicit conversion 要生成 temporary of string 10/30 19:27
notBeing: type 10/30 19:27
notBeing: 請參照 C++ 03 standard 中5.4 explicit type conversi 10/30 19:48
notBeing: on 10/30 19:48
CoNsTaR: 樓上是想講 4.1.2 ? 10/30 20:34
CoNsTaR: 不過這和原 Po 的問題有什麼關係嗎 10/30 20:34
我知道理由了 17以前的強制轉型會丟到新型別ctor內 因為轉型函數是template會無法確定是哪一個 17以後只要轉型函數可以轉成新型別,就不會有ambiguous 附帶一提,下面這個在17以後沒有複製語意 T x = T(); 補充: VS2017還不支援
PkmX: 對 因為static_cast是做direct-initialization 11/03 20:28
PkmX: C++17 多了 guaranteed copy elision 剛好可以處理這個case 11/03 20:29
loveflames: 回到上面的原始目的,用ctor加轉換函數的作法,在過程 11/03 23:05
loveflames: 遇到太多問題了,還是乖乖回去用functor好 11/03 23:05
※ 編輯: loveflames (1.173.58.226), 12/29/2017 16:56:52