[英]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
是朋友。 但是,名稱f
在A::B
尚不存在。 你將不能夠把它稱為A::B::f
,直到你提供的顯式聲明f
在A::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.