为什么我能够在没有std::限定符的情况下调用这个C++标准库函数
why am I able to invoke this C++ standard library function without std:: qualifier?
我很困惑为什么以下代码在某些情况下会编译,而在其他情况下不会编译。
#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::vector
和std::basic_string
保证连续的内部缓冲区,这允许原始指针作为迭代器。
相关文章:
- 在这种情况下,java对象是否可以调用本机函数
- 如果 std::vector::clear() 不是静态的,如何在没有实例的情况下调用它?
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- Doxygen - 如何在不生成图形的情况下生成文本调用关系结果
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- C++ - 如何在不调用其属性的情况下调用类?
- 有没有办法在没有虚拟的情况下使用基类指针调用派生类函数
- 为什么在这种情况下不调用我的虚拟函数实现?
- 在这种情况下,工会成员会调用自己的析构函数吗
- 如何在不迭代的情况下对数组中的每个元素调用方法
- C++-在没有自定义.lib文件的情况下从Lua C模块调用Lua函数
- 如何在派生类中不显式调用base::func()的情况下从基类执行虚拟函数
- C++ 在不释放内存的情况下调用析构函数
- Python在不引用类名的情况下调用类函数
- C++11 - 获取编译时的所有类变量,并在没有 Boost 的情况下为它们调用方法
- C ++:如何在不创建对象的情况下在主函数中调用方法
- 为什么在这种情况下调用非常量右值移动构造函数?
- 在这种情况下,我应该为每个WSASend调用传递唯一的重叠结构吗?
- C++ 在不知道子类型的情况下从父类型调用子方法