Name lookup
| General topics | ||||||||||||||||
| Flow control | ||||||||||||||||
| Conditional execution statements | ||||||||||||||||
| Iteration statements (loops) | ||||||||||||||||
|
||||||||||||||||
| Jump statements | ||||||||||||||||
| Functions | ||||||||||||||||
| Function declaration | ||||||||||||||||
| Lambda function expression | ||||||||||||||||
inline
specifier
|
||||||||||||||||
| Dynamic exception specifications ( until C++17* ) | ||||||||||||||||
noexcept
specifier
(C++11)
|
||||||||||||||||
| Exceptions | ||||||||||||||||
| Namespaces | ||||||||||||||||
| Types | ||||||||||||||||
| Specifiers | ||||||||||||||||
|
||||||||||||||||
| Storage duration specifiers | ||||||||||||||||
| Initialization | ||||||||||||||||
| Expressions | ||||||||||||||||
| Alternative representations | ||||||||||||||||
| Literals | ||||||||||||||||
| Boolean - Integer - Floating-point | ||||||||||||||||
| Character - String - nullptr (C++11) | ||||||||||||||||
| User-defined (C++11) | ||||||||||||||||
| Utilities | ||||||||||||||||
| Attributes (C++11) | ||||||||||||||||
| Types | ||||||||||||||||
typedef
declaration
|
||||||||||||||||
| Type alias declaration (C++11) | ||||||||||||||||
| Casts | ||||||||||||||||
| Memory allocation | ||||||||||||||||
| Classes | ||||||||||||||||
| Class-specific function properties | ||||||||||||||||
|
||||||||||||||||
| Special member functions | ||||||||||||||||
|
||||||||||||||||
| Templates | ||||||||||||||||
| Miscellaneous | ||||||||||||||||
名前探索は、プログラム内で name が出現した際に、それを導入した declaration と関連付ける手続きです。
例えば、 std:: cout << std:: endl ; をコンパイルする場合、コンパイラは以下の処理を実行します:
-
名前
stdに対する非修飾名探索。これはヘッダー <iostream> 内の名前空間stdの宣言を見つける -
名前
coutに対する修飾名探索。これは名前空間std内の変数宣言を見つける -
名前
endlに対する修飾名探索。これは名前空間std内の関数テンプレート宣言を見つける -
名前
operator<<に対する 実引数依存探索 (名前空間std内の複数の関数テンプレート宣言を見つける)と、名前 std :: ostream :: operator << に対する修飾名探索(クラス std::ostream 内の複数のメンバ関数宣言を見つける)の両方
関数および関数テンプレートの名前については、名前探索によって同じ名前に関連付けられた複数の宣言が得られる可能性があり、 実引数依存探索 から追加の宣言が得られる場合もあります。 テンプレート実引数推論 も適用される可能性があり、宣言の集合は オーバーロード解決 に渡され、使用される宣言が選択されます。 該当する場合の メンバアクセス 規則は、名前探索とオーバーロード解決の後にのみ考慮されます。
その他のすべての名前(変数、名前空間、クラスなど)については、名前探索はそれらが同じ エンティティ を宣言する場合にのみ複数の宣言を関連付けることができ、それ以外の場合はプログラムがコンパイルされるために単一の宣言を生成しなければなりません。スコープ内での名前の探索は、その名前のすべての宣言を検出しますが、「struct hack」または「型/非型の隠蔽」として知られる1つの例外があります:同じスコープ内で、名前の一部の出現は typedef ではないクラス/構造体/共用体/列挙型の宣言を参照する可能性がありますが、同じ名前の他のすべての出現は、すべて同じ変数、非静的データメンバ、または列挙子を参照するか、またはすべてオーバーロードされた関数または関数テンプレート名を参照します。この場合、エラーは発生しませんが、型名は探索から隠蔽されます(コードでは 詳細型指定子 を使用してアクセスする必要があります)。
ルックアップの種類
名前がスコープ解決演算子
::
の直後に現れる場合、または
::
に続いて曖昧性除去キーワード
template
が存在する可能性がある場合は、以下を参照してください
それ以外の場合は、以下を参照してください
-
- (関数名の場合、 Argument-dependent lookup を含む)
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| CWG 2063 | C++98 | 「struct hack」がクラススコープで適用されなかった(C言語との互換性を損なう) | 適用 |
| CWG 2218 | C++98 |
非関数(テンプレート)名のルックアップが、同じエンティティを宣言している場合でも
複数の宣言を関連付けられなかった |
許可 |
関連項目
- スコープ
- 実引数依存の名前探索 (ADL)
- テンプレート実引数推論
- オーバーロード解決
|
C documentation
for
Lookup and name spaces
|