为什么我能够在没有std::限定符的情况下调用这个C++标准库函数

why am I able to invoke this C++ standard library function without std:: qualifier?

本文关键字:调用 情况下 库函数 标准 C++ 为什么 std      更新时间:2023-10-16

我很困惑为什么以下代码在某些情况下会编译,而在其他情况下不会编译。

#include <iostream>
#include <vector>
#include <algorithm>
int main(){
  std::vector<int> v(3);
  int a[] = {3, 6, 2};
  std::copy(a, a+3, v.begin());
#define CASE 2
#if CASE == 0
  std::cout << *max_element(a, a+3) << "n";
#elif CASE == 1
  std::cout << *std::max_element(a, a+3) << "n";
#else 
  std::cout << *max_element(v.begin(), v.end()) << "n";
#endif
  return 0;
}

我列举了三种情况:CASE 0无法编译,因为没有"max_element"这类东西。我在案例1中通过改为"std::max_element"来解决这个问题,它编译并按预期工作。

然而,有趣的是,对于CASE2(从技术上讲,除了0或1之外的任何东西),它也可以编译并工作。但是案例2和案例0有同样的问题,那么为什么它能起作用呢?

在最后一种情况下,您表示"case 2",参数是迭代器,对于您的标准库实现,它们属于在命名空间std中定义的类型。

然后,依赖于参数的查找,更常见的名称是ADL,现在不太常见的名称为Koenig查找(以Andrew Koenig命名),在该名称空间中查找函数名。


ADL是一种机制,例如在您编写时为您找到非成员operator+

std::string const a = "Blah";
foo( a + "Blah " );

但它也可以找到普通的命名函数,而不仅仅是运算符。

不幸的是,没有类似的机制可以走另一条路;函数相关查找”例如,可以找到在类中定义并在该类的成员函数调用的参数表达式中使用的类型。


由于cco std::vector被允许使用原始指针作为迭代器,因此不能保证代码能够与另一个标准库实现一起使用。

注意:
cco std::vectorstd::basic_string保证连续的内部缓冲区,这允许原始指针作为迭代器。

相关文章: