名前解決
プログラミング言語の式には、識別子が含まれる。式の意味は、その識別子が指す実体が何であるかに依存する。識別子がその文脈において何を指すのかを決定するアルゴリズムは、その言語の定義の一部である。
そのアルゴリズムの計算量は、その言語の洗練度合いによって変わってくる。例えば、アセンブリ言語での名前解決は単純な連想配列の参照だが、C++の名前解決には以下のような事柄が関係し、遥かに複雑である。
名前空間により、ある識別子はどの名前空間に属しているかで意味が変わってくる。
スコープにより、スコープのレベルによって識別子の意味が異なる場合がある。また、スコープはオーバーライドされたり、隠蔽されたりする。基本的には最も近いスコープでの束縛を見つけることで名前解決でき、局所変数は大域変数に取って代わることになる。
「可視性規則 (visibility rules)」により、特定の名前空間やスコープの識別子が現在のコンテキストから見えるかどうかが決定される。
多重定義により、名前空間やスコープが同じであっても、識別子の使い方によって異なる意味を持たせることができる。
「アクセス可能性 (accessibility)」により、通常なら可視のスコープにある識別子を名前解決の際に考慮するか否かが変更できる。
「実引数依存の名前探索」により、実引数の型に関係する名前空間から解決の候補となる名前を探す場合がある。