Re: [問題] cannot appear in a constant-expression

看板C_and_CPP作者 (JOMI)時間8年前 (2017/03/14 01:48), 8年前編輯推噓1(103)
留言4則, 1人參與, 最新討論串4/5 (看更多)
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

03/18 09:28, , 1F
using獲得的函數宣告與ADL地位相同,比誰參數比較相
03/18 09:28, 1F

03/18 09:28, , 2F
03/18 09:28, 2F

03/18 09:29, , 3F
然後你最後的例子明顯是編譯器偷偷引入
03/18 09:29, 3F

03/18 09:29, , 4F
std::random_shuffle
03/18 09:29, 4F
文章代碼(AID): #1OnjjHKG (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1OnjjHKG (C_and_CPP)