Namespaces
Variants

Name lookup

From cppreference.net
C++ language
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
constexpr (C++11)
consteval (C++20)
constinit (C++20)
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 が存在する可能性がある場合は、以下を参照してください

それ以外の場合は、以下を参照してください

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
CWG 2063 C++98 「struct hack」がクラススコープで適用されなかった(C言語との互換性を損なう) 適用
CWG 2218 C++98 非関数(テンプレート)名のルックアップが、同じエンティティを宣言している場合でも
複数の宣言を関連付けられなかった
許可

関連項目

C documentation for Lookup and name spaces