推 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