簡體   English   中英

為什么在某些情況下我不需要“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查找)是用於在函數調用表達式中查找非限定函數名稱的規則集,包括對重載運算符的隱式函數調用。 除了通常的非限定名稱查找所考慮的范圍和名稱空間之外,還會在其參數的名稱空間中查找這些函數名稱

在您正在使用的實現中, vector的迭代器begin()end()以這樣的方式實現,即可以實現。

在第二個示例中,這是不可能的,因為min_element的參數只是數組nums 地址 所以你必須專門使用std::以便查找符合條件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM