簡體   English   中英

朋友定義的函數的命名空間是什么?

[英]What is the namespace of a friend-defined function?

如果我在一個類中定義了一個函數。 該函數的命名空間是什么?

namespace A{namespace B{
    struct S{
        friend void f(S const&){};
    };
}}

int main(){
    A::B::S s{};
    f(s); // ok
    ::f(s); // not ok, no f in global namespace
    A::B::f(s); // no f in A::B
    A::B::S::f(s); // not ok, no f in A::B::S
}

它甚至有名稱空間嗎? 擁有命名空間是否有意義?

如果我想消除常用習語中的呼叫,該怎么辦?

using std::swap;
swap(a, b);

我是否被迫在課外定義並宣布為朋友?

友元聲明是指來自最窄的封閉命名空間的函數。 但是, 它不會將該函數的名稱引入名稱空間

9.3.1.2命名空間成員定義
3如果非本地類中的朋友聲明首先聲明了類,函數,類模板或函數模板,則該朋友是最內層封閉命名空間的成員。 友元聲明本身不會使名稱對非限定查找或限定查找可見。

http://eel.is/c++draft/namespace.memdef#3

所以,在你的情況下, A::B::f是朋友。 但是,名稱fA::B尚不存在。 你將不能夠把它稱為A::B::f ,直到你提供的顯式聲明fA::B

名稱查找能夠通過名為Argument Dependent Lookup (ADL)的特殊機制在非限定f(s)調用中找到f ADL是唯一可以“看到”您的功能的機制。

該函數在A::B但只能通過ADL或Koenig Lookup找到。

在main中命名它的唯一方法是在類定義之外引入它。

是的,這很奇怪。

namespace A{namespace B{
  inline void f(S const&);
  struct S{
    friend void f(S const&){};
  };
}}

現在A::B::f命名為f

我用這個技術來介紹運算符和其他自定義點。 它還允許在不是自身模板的模板類上創建每個模板實例函數。

template<class T>
struct foo {
  friend void not_a_template( T ){}
};
template<class T>
void is_a_template(T){}

是的,你在外面定義函數並使它成為某個類的朋友。 它絕對是獨立的功能,但你允許它訪問某些類。

首先在名稱空間中聲明的每個名稱都是該名稱空間的成員。 如果非本地類中的友元聲明首先聲明一個類或函數,那么友元類或函數是最內層封閉命名空間的成員。

暫無
暫無

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

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