2014-02-06 77 views
6

前幾天我問了一個關於在類定義友元函數(Which scope does an in-class-defined friend function belong to?)範圍內的問題,我瞭解該功能是在封閉的命名空間的範圍,但直到明確聲明將無法搜索課外(ADL是個例外)。在課堂上定義好友功能的範圍?

今天,我發現,在C++標準一些相關的語句(部分11.3):

的函數可以在一個類的一個朋友聲明來定義當且僅當所述類是一個非局部類( 9.8),函數名稱是不合格的,函數具有命名空間範圍。 [例如:

class M { 
    friend void f() { } // definition of global f, a friend of M, 
         // not the definition of a member function 
}; 
—end example ] 

這樣的函數隱含地是inline。在類中定義的朋友函數位於定義它的類的(詞法)範圍內。在課堂外定義的朋友函數不是(3.4.1)。

我們可以看到,有兩個範圍相關的語句在這裏:「有命名空間內」「是在它被定義的類(詞法)範圍」。我很困惑。如果前者與我之前的問題(Which scope does an in-class-defined friend function belong to?)有關,那麼後者代表什麼?

+0

AFAIK,它是關於友元函數內部名稱查找。 [現場示例](http://coliru.stacked-crooked.com/a/046896a00ece8086) – dyp

回答

1

A「命名空間範圍功能」是一個函數,它是一個命名空間的成員(即「範圍」在這裏是指該功能的「家範圍」)。

後來的聲明鏈接到3.4.1,這不得不說是描述在類授予友誼將開始聯定義友元函數(11.3)的定義中使用的名稱

名稱查找用於查找成員函數定義。