[英]scope resolution operator without a scope
在C ++中,不帶范圍使用范圍解析運算符的目的是什么? 例如:
::foo();
這意味着全球范圍。 如果在同一作用域中有沖突的函數或變量,並且需要使用全局運算符,則可能需要使用此運算符。 您可能會有類似以下內容:
void bar(); // this is a global function
class foo {
void some_func() { ::bar(); } // this function is calling the global bar() and not the class version
void bar(); // this is a class member
};
如果需要從類成員函數中調用全局bar()函數,則應使用:: bar()來獲取函數的全局版本。
還應注意,名稱解析發生在重載解析之前。 因此,如果您當前的作用域中存在具有相同名稱的名稱,那么它將停止尋找其他名稱並嘗試使用它們。
void bar() {};
class foo {
void bar(int) {};
void foobar() { bar(); } // won't compile needs ::bar()
void foobar(int i) { bar(i); } // ok
}
在全局名稱空間中查找以范圍解析運算符 ( ::
:)開頭的名稱。 通過查看C ++標准草案第3.4.3
節“ 合格名稱查找”第4段可以看到這一點,其中( 強調我的 ):
由一元作用域運算符:::(5.1)前綴的名稱是在全局作用域中使用的翻譯單位中查找的 。 該名稱應在全局名稱空間范圍內聲明,或者是由於使用指令(3.4.3.2)而在全局范圍內可見的名稱。 使用:: 允許引用全局名稱,即使其標識符已隱藏 (3.3.10)。
按照標准,這允許我們使用全局名稱空間中的名稱,否則它們將被隱藏 ,鏈接文檔中的示例如下:
int count = 0;
int main(void) {
int count = 0;
::count = 1; // set global count to 1
count = 2; // set local count to 2
return 0;
}
措辭與N1804非常相似,后者是最早的標准草案。
如果在本地作用域中已經有一個名為foo()的函數,但是您需要在全局作用域中訪問該函數。
我的c ++生銹了,但是我相信,如果您有一個在局部范圍內聲明的函數,例如foo()和一個在全局范圍內聲明的函數,則foo()則指的是局部函數。 :: foo()將引用全局變量。
指全球范圍
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.