[問題] casting operator的問題

看板C_and_CPP (C/C++)作者 (咕啾咕啾魔法陣)時間8年前 (2017/10/30 16:10), 8年前編輯推噓6(6019)
留言25則, 4人參與, 8年前最新討論串1/1
開發平台(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

10/30 18:30, 8年前 , 1F
你這樣子是在建構 FOO<int,int>,不是在呼叫 operator U
10/30 18:30, 1F

10/30 18:30, 8年前 , 2F
10/30 18:30, 2F

10/30 18:32, 8年前 , 3F
還是現在 c++17 又有什麼神奇的新規定了嗎
10/30 18:32, 3F

10/30 18:34, 8年前 , 4F
喔喔… 是我腦殘了 XDD
10/30 18:34, 4F

10/30 18:58, 8年前 , 5F
我的原始目的是模擬偏特化函數模板,想嘗試看看functo
10/30 18:58, 5F

10/30 18:58, 8年前 , 6F
r以外的方法
10/30 18:58, 6F

10/30 18:59, 8年前 , 7F
costructor缺點是無法回傳,所以想了一個轉型的解法
10/30 18:59, 7F

10/30 19:01, 8年前 , 8F
至於17,是有一個ctor參數推導模板參數的新規定,類
10/30 19:01, 8F

10/30 19:01, 8年前 , 9F
似函數那樣
10/30 19:01, 9F

10/30 19:18, 8年前 , 10F
template <typename T> T foo = (T)FOO<int,int>().opera
10/30 19:18, 10F

10/30 19:18, 8年前 , 11F
tor T(); f(foo<string>);
10/30 19:18, 11F

10/30 19:19, 8年前 , 12F
這樣編譯可以過欸,完全不知道原因…
10/30 19:19, 12F

10/30 19:22, 8年前 , 13F
感覺是編譯器的型別推論有問題?
10/30 19:22, 13F

10/30 19:22, 8年前 , 14F
不過不只 gcc,clang 也這樣真的滿奇怪的
10/30 19:22, 14F

10/30 19:26, 8年前 , 15F
VC++的行為也是一樣
10/30 19:26, 15F

10/30 19:27, 8年前 , 16F
因為 explicit conversion 要生成 temporary of string
10/30 19:27, 16F

10/30 19:27, 8年前 , 17F
type
10/30 19:27, 17F

10/30 19:48, 8年前 , 18F
請參照 C++ 03 standard 中5.4 explicit type conversi
10/30 19:48, 18F

10/30 19:48, 8年前 , 19F
on
10/30 19:48, 19F

10/30 20:34, 8年前 , 20F
樓上是想講 4.1.2 ?
10/30 20:34, 20F

10/30 20:34, 8年前 , 21F
不過這和原 Po 的問題有什麼關係嗎
10/30 20:34, 21F
我知道理由了 17以前的強制轉型會丟到新型別ctor內 因為轉型函數是template會無法確定是哪一個 17以後只要轉型函數可以轉成新型別,就不會有ambiguous 附帶一提,下面這個在17以後沒有複製語意 T x = T(); 補充: VS2017還不支援

11/03 20:28, 8年前 , 22F
對 因為static_cast是做direct-initialization
11/03 20:28, 22F

11/03 20:29, 8年前 , 23F
C++17 多了 guaranteed copy elision 剛好可以處理這個case
11/03 20:29, 23F

11/03 23:05, 8年前 , 24F
回到上面的原始目的,用ctor加轉換函數的作法,在過程
11/03 23:05, 24F

11/03 23:05, 8年前 , 25F
遇到太多問題了,還是乖乖回去用functor好
11/03 23:05, 25F
※ 編輯: loveflames (1.173.58.226), 12/29/2017 16:56:52
文章代碼(AID): #1PzjwHwV (C_and_CPP)
文章代碼(AID): #1PzjwHwV (C_and_CPP)