web-dev-qa-db-ja.com

完全修飾名とは何ですか?

私が知る限り、完全修飾という用語は標準( eg )には記載されていませんが、オンラインで何度も「聞く」ことを思い出してください。

名前が完全に修飾されていると言うとき、人々はどういう意味ですか?

これは重要ですか?

A::f()

それともこれだけ?

::A::f()

そして、それが標準である場合、どの文言を見つけられませんか?

スコープ解決演算子を使用する識別子は、[expr.prim.id.qual]による修飾名です。それ以外の場合は無資格です。

標準は完全修飾の意味を定義していませんが、[library]/[requirements]/[organization]/[contents]でそれを言及します(標準ドラフトからの引用)

標準ライブラリで定義されている名前xが言及されている場合は、特に明記されていない限り、名前xは:: std :: xとして完全修飾されていると見なされます。たとえば、ライブラリ関数FのEffects:要素がライブラリ関数Gの呼び出しとして記述されている場合、関数:: std :: Gが意味されます。

ウィキペディアで定義されている 完全修飾名

コンピュータプログラミングでは、完全修飾名は、呼び出しのコンテキストに関係なく、呼び出しが参照するオブジェクト、関数、または変数を指定する明確な名前です。

グローバル名前空間から始まる修飾された名前のみが、コンテキストなしで明確になります。これは一般的な使用法です。

45
eerorika

確かに、それは標準的な用語ではありません。規格には定義がありません。

ただし、「完全修飾」というフレーズは、[コンテンツ](執筆時点での最新ドラフトN4800の15.5.1.1「ライブラリコンテンツ」)の段落3に1回だけ表示されます。

標準ライブラリで定義されているxという名前が言及されている場合は、特に明記されていない限り、x::std::xとして完全修飾されていると見なされます。

したがって、この定義では、::で始まる名前のみが完全修飾されています。

23
Sebastian Redl