c++中的函数调用有哪几种方式 c++中的函数调用
ADL(依赖于参数的查找)是C Swap(a) b)这类无命名空间邻近的函数时,编译器会检查a.间,并在其中搜索匹配函数。例如MyNS::MyClass对象调用sw ap会触发对MyNS中自定义swap的查找;同样,Data::Poi nt对象使用==操作符时,编译器通过ADLData命名空间下的o perator==。其核心规则是:若函数调用为非限定且形式参数类属于某命名空间,则该命名空间被纳入查找范围。所在命名空间及模板参数的相关命名空间。使用std::swap;swap(obj1,obj2))和运算符重载,支持泛型编程与自定义行为扩展。但重载歧义或意外函数匹配问题,如N::X对象调用f(x)选择N::f而非全局或其他作用域中的f。掌握ADL“参数类型函数查找范围”的原则依据。

ADL(参数依赖) Lookup),中文名为“依赖于参数的查找”,是C ADL的基本规则
当调用一个未添加限定的函数(即没有写明命名空间导出,如std::)时,编译器除了在常规数外,还有检查函数参数类型的所在定义命名空间,并在这些命名空间中搜索匹配的函数。
简单地说:如果你确定的参数属于某个命名空间,编译器就会去那个命名空间里找有没有对应的函数。
触发ADL的条件学习:
立即学习“C” “Unqualified”,比如直接写swap(a) b)而不是std::swap(a) b)至少有一个参数的类型与某种命名空间相关)常见示例说明
示例1:使用std中的swap
考虑以下代码:#include lt;utilitygt;lt;brgt;namespace MyNS {lt;brgt; struct MyClass {};lt;brgt; void swap(MyClassamp;, MyClassamp;) { /* 自定义swap */ }lt;brgt;}lt;brgt;lt;brgt;int main() {lt;brgt; MyNS::MyClass a, b;lt;brgt; swap(a, b); // ADL 生效 lt;brgt; return 0;lt;brgt;}登录后复制
这里调用的是swap(a) b),虽然没有写MyNS::swap,但由于a和b的类型是MyNS::MyCla ss,编译器会自动去MyNS中查找swap函数,因此调用的是MyNS::swap。
这种广泛用于标准库的机制,比如std::swap的通用做法就是:using std::swap;lt;brgt;swap(obj1,obj2); // 可能调用特化的swap,也可能回退到std::swap登录后复制
这就是所谓的“using swap惯用法”,利用ADL优先调用针对特定类型的优化版本,否则使用标准实现。 vizcom.ai
AI草图渲染工具,快速将点击草图渲染成精美的图像70查看详情
示例2:符操作重载与ADL
ADL也适用于运算符。例如:namespace Data {lt;brgt;struct Point { int x, y; };lt;brgt; bool operator==(const Pointamp; a, const Pointamp; b) {lt;brgt; return a.x == b.x amp;amp; a.y == b.y;lt;brgt; }lt;brgt;}lt;brgt;lt;brgt;int main() {lt;brgt; 数据::点 p1{1,2}, p2{1,2};lt;brgt; if (p1 == p2) { } // ADL 定位数据::operator==lt;brgt; return 0;lt;brgt;}登录后复制
虽然operator==没有在全局声明,但由于p1和p2所属Data::Point,编译器会在数据命名空间中找到匹配的操作成功符,调用自定义的operator==。ADL查找的关联命名空间
对于不同类型的参数,ADL会创建其“关联命名空间”(关联命名空间)。
描述:阅读更多其所在定义的命名空间指针、引用、引用等复合类型,其关联命名空间由其指向/包含的类型决定
例如:namespace // ADL找到NS::func,因为amp;a的类型是NS::A*登录后复制注意事项与陷阱
ADL虽然强大,但可能引发意料之外的行为:更多代码下载中因ADL引入非预期函数而改变行为
例如:namespace N {lt;brgt; struct f(int);lt;brgt;}lt;brgt;lt;brgt;int main() {lt;brgt; N::X x;lt;brgt; f(42); // OK,调用 M::flt;brgt; f(x); // 调用 N::f,ADL 使 N 成为查找范围 lt;brgt;}登录后复制
注意 f(x) 可以正确调用 N ADL 是 C 支持泛型编程和符操作重载的重要基础,理解它有助于写出更灵活、可扩展的代码,也能避免就掌握了关键。
以上就是c中的ADL(依赖于参数的查找)规则是什么_c中ADL(依赖于参数的查找)规则解析与示例的详细内容,更多请关注乐哥常识网其他相关文章!相关标签: ai c 作用域编译错误标准库泛型实参对象作用域大家都在看: TensorFlow分散训练配置怎样用C开发井字棋AI简单决策算法实现方案C中如何实现符号计算_代数字系统设计怎样为C配置嵌入式AI开发环境TensorFlow Lite微移植指南
