簡體   English   中英

沒有范圍的范圍解析運算符

[英]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.

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