![](/img/trans.png)
[英]Why do I need to write "std::string" but not "std::getline()"?
[英]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查找)是用於在函數調用表達式中查找非限定函數名稱的規則集,包括對重載運算符的隱式函數調用。 除了通常的非限定名稱查找所考慮的范圍和名稱空間之外,還會在其參數的名稱空間中查找這些函數名稱 。
在您正在使用的實現中, vector
的迭代器begin()
和end()
以這樣的方式實現,即可以實現。
在第二個示例中,這是不可能的,因為min_element
的參數只是數組nums
地址 。 所以你必須專門使用std::
以便查找符合條件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.