[問題] casting operator的問題

作者: loveflames (咕啾咕啾魔法陣)   2017-10-30 16:10:52
開發平台(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
想請教有人知道原因嗎
作者: CoNsTaR ((const *))   2017-10-30 18:30:00
你這樣子是在建構 FOO<int,int>,不是在呼叫 operator U欸還是現在 c++17 又有什麼神奇的新規定了嗎喔喔… 是我腦殘了 XDD
作者: loveflames (咕啾咕啾魔法陣)   2017-10-30 18:58:00
我的原始目的是模擬偏特化函數模板,想嘗試看看functor以外的方法costructor缺點是無法回傳,所以想了一個轉型的解法至於17,是有一個ctor參數推導模板參數的新規定,類似函數那樣
作者: CoNsTaR ((const *))   2017-10-30 19:18:00
template <typename T> T foo = (T)FOO<int,int>().operator T(); f(foo<string>);這樣編譯可以過欸,完全不知道原因…感覺是編譯器的型別推論有問題?不過不只 gcc,clang 也這樣真的滿奇怪的
作者: loveflames (咕啾咕啾魔法陣)   2017-10-30 19:26:00
VC++的行為也是一樣
作者: notBeing (read and be read)   2017-10-30 19:27:00
因為 explicit conversion 要生成 temporary of stringtype請參照 C++ 03 standard 中5.4 explicit type conversion
作者: CoNsTaR ((const *))   2017-10-30 20:34:00
樓上是想講 4.1.2 ?不過這和原 Po 的問題有什麼關係嗎
作者: PkmX (阿貓)   2017-11-03 20:28:00
對 因為static_cast是做direct-initializationC++17 多了 guaranteed copy elision 剛好可以處理這個case
作者: loveflames (咕啾咕啾魔法陣)   2017-11-03 23:05:00
回到上面的原始目的,用ctor加轉換函數的作法,在過程遇到太多問題了,還是乖乖回去用functor好

Links booklink

Contact Us: admin [ a t ] ucptt.com