You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++标准库中除std::swap外,哪些函数需通过ADL方式调用?

C++中适合通过ADL定制、需用using std::foo; foo();形式调用的标准库函数

你习惯手动加std::前缀的做法很稳妥,除了std::swap,C++标准库中还有不少函数遵循同样的ADL定制模式,下面是几个常见的:

  • std::begin/std::end 及相关迭代器函数:包括std::cbegin/std::cend、std::rbegin/std::rend等C++11引入的非成员迭代器获取函数。如果你实现了一个自定义容器类型,在其命名空间里重载这些函数后,用using std::begin; begin(my_custom_container);的方式调用,会优先通过ADL匹配到你自定义的版本;如果是原生数组,则会自动使用std::begin的数组重载版本。

  • std::size/std::empty/std::data:C++17新增的这三个非成员函数,分别用于获取对象大小、判断是否为空、获取底层数据指针。自定义类型可以在自身命名空间重载这些函数,比如让自定义容器返回正确的元素数量,或者让自定义字符串返回底层字符数组指针。使用using std::size; size(my_obj);的形式,既能在没有自定义实现时回退到标准库版本,又能优先调用定制的重载。

  • std::iter_swap:这个函数用于交换两个迭代器指向的元素。标准库的算法中可能会不限定调用它,如果你自定义了迭代器类型,并且需要特殊的交换逻辑,可以在迭代器所在的命名空间重载iter_swap,然后通过using std::iter_swap; iter_swap(it1, it2);的方式调用,确保ADL能找到你的定制版本。

  • std::swap_ranges:虽然它是算法模板,但如果你的自定义迭代器需要特殊的范围交换逻辑,也可以在迭代器的命名空间重载它。使用时同样通过using std::swap_ranges; swap_ranges(first1, last1, first2);的形式,让ADL优先匹配定制版本。

本质上,这类函数的共同特点是:标准库提供了通用/基础类型的实现,同时允许用户在自定义类型的命名空间中提供更适配的重载,通过using std::foo; foo(...)的不限定调用,既能利用ADL优先选择定制版本,又能在没有定制时回退到标准库实现,是C++中兼顾通用性和定制性的惯用法。

内容的提问来源于stack exchange,提问作者Sourav Kannantha B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 06:01:32