作者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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1489427281.A.510.html
※ 编辑: lovejomi (118.163.10.190), 03/14/2017 02:34:50
1F:推 loveflames: using获得的函数宣告与ADL地位相同,比谁参数比较相 03/18 09:28
2F:→ loveflames: 符 03/18 09:28
3F:→ loveflames: 然後你最後的例子明显是编译器偷偷引入 03/18 09:29
4F:→ loveflames: std::random_shuffle 03/18 09:29