彼はおそらくこれを意味しました:
struct foo{
friend void bar(foo* z){} //not static, its friend now
};
foo* z;
bar(z); //fine now
しかし、技術的には内部にbar()
はありません。それはまだの囲んでいる名前空間にあります。 foo
foo
-
編集:
彼が言ったfriend
ように、彼は確かに意味しました(私の強調):
最良の例は、型内で定義されているフレンド関数です。
そして彼の例はさらに説明しています。おそらく、「内部」だけでなく、「内部で定義」を読む必要があります。
関数の名前がクラスのスコープに導入されているように見えるため、「定義された」という単語が違いを生みますが、実際には、名前はの囲んでいる名前空間に導入されます(§3.3.1/3-を参照)。 4および§11.3/6)。 bar
bar
foo
より良い例を次に示します。
namespace Demo
{
struct foo
{
friend void bar(foo* z){}
};
}
foo *z;
bar(z); //foo (type of z) is inside Demo, so is bar
//(even though bar is defined inside foo!)
bar(NULL); //error - NULL doesn't help ADL.
bar(nullptr); //error - nullptr doesn't help ADL.
bar(static<foo*>(NULL)); //ok - ADL
名前空間にbar
導入されたとしても、名前は非表示になっているため、通常の名前ルックアップを使用して外部から使用することはできないことに注意してください。Demo
using namespace Demo; //brings ALL (visible) names from Demo to current scope
bar(NULL); //STILL error - means bar is invisible
または、
Demo::bar(NULL); //error - not found
Demo::foo::bar(NULL); //error - not found
お役に立てば幸いです。