gpt4 book ai didi

c++ - 有什么理由 find_if、for_each、count 等不需要 std::?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:15:15 26 4
gpt4 key购买 nike

我刚刚发现标准 algorithm header 中的几种算法不需要 std::

例子:

#include <vector>
#include <algorithm>

int main() {
std::vector<int> m;
count(m.begin(), m.end(), 0);
count_if(m.begin(), m.end(), [](auto){return true;});
for_each(m.begin(), m.end(), [](auto){});
find_if(m.begin(), m.end(), [](auto){return true;});
}

Live demo at coliru

有什么具体原因吗? g++clang++ 都接受上面的代码。

最佳答案

这里有两件事。

首先是 ADL,或 Argument Dependent Name Lookup .

这些功能是通过 ADL 找到的。这是因为一些参数(即 vectoriterator 类型)位于 std 中,所以当重载解析查找 for_each,它查找通常的命名空间集(在本例中为 root),以及由其参数的命名空间确定的命名空间。

诀窍在于 vector::iterator 不保证namespace std 中的类型。所以你的代码不能保证工作。它可能std 中的类型,也可能是原始指针,也可能是namespace __std__utility_types 中的类型,或其他任何地方.

所有主要的编译器库都有 vector 迭代器是非指针,它们在 namespace std 中,因为替代方案被认为更糟糕。但是缺乏保证意味着您不应该依赖它来获得真正可移植的代码。

关于c++ - 有什么理由 find_if、for_each、count 等不需要 std::?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41201298/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com