为什么在某些情况下不需要"std::"?
Why do I not need "std::" in some scenarios?
为什么要起作用:
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> nums = {3, 7, 5};
std::cout << *min_element(nums.begin(), nums.end()) << "n";
}
但这不是:
#include <algorithm>
#include <iostream>
int main() {
int nums[] = {3, 7, 5};
std::cout << *min_element(nums, nums + 3) << "n";
}
我发现,如果我在第二个示例中将呼叫更改为min_element
,因此它包含一个命名空间,例如std::min_element
,则可以正常工作。我不明白的是为什么在第一个示例中不需要这一点。vector
是否以某种方式神奇地知道在哪里可以找到min_element
,如果是,为什么?
在第一个示例中,使用ADL并找到min_element
。在此示例中,min_element
的参数是迭代器(nums.begin(), nums.end()
)。
与参数有关的查找,也称为ADL或Koenig查找,是在函数call表达式中查找无限制函数名称的规则集,包括对超载运算符的隐式函数调用。这些函数名称还在其参数的名称空间中查找,除了通常的无限制名称查找的范围和名称空间。
在您正在使用的实现中,vector
的迭代器begin()
和end()
的实现方式以至于可以。
在第二个示例中,这是不可能的,因为对min_element
的参数仅是数组nums
的 address 。因此,您必须专门使用std::
,以便查找资格。
相关文章:
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- 为什么output_editor Concept不需要output_e迭代器标记
- 如果不需要易失性,为什么 std::atomic 方法会提供易失性重载
- 为什么在这种特殊情况下不需要将 std::hash() 的专用化注入到 std 命名空间中?
- 为什么常量CLOCKS_PER_SEC不需要用 std:: 命名,但 <ctime> clock() 和 clock_t 可以呢?
- 为什么在某些情况下不需要"std::"?
- 我们应该序列化 std::chrono::d uration 类还是 P.O.D.(普通旧数据)并且不需要序列化
- std::regex_replace 不需要少于 6 个参数
- 如果 std::shared_ptr 是从非 null 构造的,为什么它不需要知道完整的类型?
- 为什么 <algorithm> std::copy 或 std::swap 不需要?
- 通过使用不同的参数调用每个元素的非默认构造函数来初始化std::vector,而不需要进行不必要的复制
- 我可以 std::bind 基类的构造函数,以便派生不需要显式调用它吗?
- 为什么<cmath>函数不需要"using std::xxx"?
- 如果std::make_unique从未被调用,为什么它在默认成员初始化中不需要参数
- 为什么我不需要 std::move to std::bind'ed 函数?
- 为什么C++不需要"new"语句来初始化 std::vector?
- 为什么遗留C标识符不需要命名空间std
- clang中是否有一组已知的' c++11 '特性默认启用而不需要' -std=c++11 ' ?
- 使用 isalpha 函数时不需要 std 命名空间