看板 C_and_CPP 關於我們 聯絡資訊
L大你好 針對你提的friend name injection 我做了以下測試 但 VC http://rextester.com/ATEDB8089 GCC && CLANG http://rextester.com/YFPO4237 VC vs GCC 行為不一樣 一直在思考你的話 "以ADL來找f是否在U中 再以friend name injection讓U可見void f(U*)" 所謂的"ADL來找" 應該是我測試程式測的 a,b是A型別 ADL會想找class A這個scope裡面是否有swap函數 測試code中遮掉 = 找不到 如果把測試code uncomment後 就是你說的 "再以friend name injection讓A可見swap" 所提的inject這個動作? 所以ADL的優先權 > 我明明有寫using std::swap 然而測試程式GCC版本 因為我遮掉 所以ADL 找不到 只好找std::swap版本? 以上觀念有誤嗎? 但VC測試顯示 他不需要inject 只要有定義似乎他就能找到....(這又是VC的不遵守spec的行為嗎?) 所以以上這些觀念 在TMP下會有神奇的運用嚕? 因為google 並沒有直接針對friend name injection 這的教學 , 只有幾篇stackoverflow的問題 謝謝指導 BTW, http://rextester.com/MOI47734 剛剛想再更清楚知道ADL 遇到這個問題, 但這件事要是寫成一般function(遮住的) 就沒問題... 觀念上感覺有點錯誤 目前我觀念 ADL 因為參數是在std底下 找std的版本 這樣應該會走std 版本的, 但反倒是error收場 如果改成一般function 卻又可以走一般function了(很合理 但這時ADL就不會先介入?) 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.163.10.190 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1489427281.A.510.html ※ 編輯: lovejomi (118.163.10.190), 03/14/2017 02:34:50
loveflames: using獲得的函數宣告與ADL地位相同,比誰參數比較相 03/18 09:28
loveflames: 符 03/18 09:28
loveflames: 然後你最後的例子明顯是編譯器偷偷引入 03/18 09:29
loveflames: std::random_shuffle 03/18 09:29