为什么C++中实参依赖查找(ADL)对类型别名不生效?
问题原因
实参依赖查找(ADL)并没有失效,你遇到的报错完全符合C++标准的ADL规则:
ADL的查找范围仅包含实参类型的关联命名空间。你代码里的foo::Values是std::array<int, 2>的类型别名,并非foo命名空间下自定义的独立类型,它的关联命名空间只有标准库的std命名空间,查找function函数时根本不会进入foo命名空间检索,自然会报函数找不到的错误。
无需
using foo::function的替代方案 - 最简洁通用的方案:调用函数时显式指定命名空间
直接将调用语句改为foo::function(v);即可,不需要修改任何现有定义,可读性也最高,是这类场景的首选写法。 - 如果要保留无命名空间前缀的调用方式,可以把
Values改为foo下的自定义强类型而非类型别名:
此时namespace foo { // 继承std::array实现自定义类型,保留array的所有能力 struct Values : std::array<int, 2> { using std::array<int, 2>::array; }; void function(const Values& v) {std::cout << v[0] << " " << v[1] << '\n';} }Values本身属于foo命名空间,ADL会自动检索foo下的函数,直接写function(v)即可正常调用。
注意:不建议为了适配ADL将自定义函数添加到
std命名空间,C++标准禁止用户向std命名空间注入自定义内容,这种写法属于未定义行为。
内容的提问来源于stack exchange,提问作者dgruending
相关产品推荐
相关产品推荐

