代碼中出現 ::swap(...) 或 ::x,問為什麼可以直接用 :: 調用。
:: (一元作用域解析運算符) 表示「全局命名空間」。 用於在**局部作用域存在同名標識符**時,顯式訪問**全局作用域**的函數、變量、類型、命名空間成員。
#include
using namespace std;
int x = 10; // 全局變量 x
void swap(int& a, int& b) { // 全局函數 swap
int t = a; a = b; b = t;
}
int main() {
int x = 20; // 局部變量 x,遮蔽全局 x
int a = 1, b = 2;
cout << "局部 x = " << x << endl; // 20
cout << "全局 x = " << ::x << endl; // 10 (用 :: 訪問全局)
swap(a, b); // 調用全局 swap (無同名局部函數,可直接調用)
cout << "a=" << a << ", b=" << b << endl; // 2, 1
// 若 main 內定義了同名局部函數/lambda 遮蔽全局 swap
auto swap = [](int&, int&){ /* ... */ }; // C++11 lambda
swap(a, b); // 調用局部 lambda
::swap(a, b); // 显式調用全局 swap
return 0;
}
| 場景 | 代碼示例 | 說明 |
|---|---|---|
| 局部變量遮蔽全局變量 | ::g_var | 在函數內訪問被同名局部變量遮蔽的全局變量 |
| 局部函數/lambda 遮蔽全局函數 | ::func() | 在函數內顯式調用全局函數而非局部可調用對象 |
| 類成員函數中調用同名全局函數 | ::helper() | 類內有同名靜態/成員函數時,調用全局輔助函數 |
| 定義全局命名空間類型別名 | using ::MyType; | 將全局類型引入當前命名空間 |
| 模板元編程/ADL 輔助 | ::std::move | 強制使用全局 std 命名空間,避免參數依賴查找 (ADL) 找到非預期重載 |
:: 專指全局命名空間,類成員訪問用類名/對象/指針。namespace fs = std::filesystem; 後用 fs::path,非 ::fs::path。:: 讓你在「名字衝突」時,精準鎖定「全局作用域」的那個實體。 見到 ::swap、::x 即表示:**此處有同名局部標識符,程序員明確意圖調用全局的 swap 函數 / x 變量**。這是 C++ 作用域規則精確控制的體現。