作者lovejomi (JOMI)
看板C_and_CPP
標題Re: [問題] cannot appear in a constant-expression
時間Tue Mar 14 01:47:57 2017
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