名前空間
変種
操作

名前探索

提供: cppreference.com
< cpp‎ | language
 
 
C++言語
一般的なトピック
フロー制御
条件付き実行文
繰り返し文 (ループ)
ジャンプ文
関数
関数宣言
ラムダ関数宣言
inline 指定子
例外指定 (C++20未満)
noexcept 指定子 (C++11)
例外
名前空間
指定子
decltype (C++11)
auto (C++11)
alignas (C++11)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点
文字 - 文字列 - nullptr (C++11)
ユーザ定義 (C++11)
ユーティリティ
属性 (C++11)
typedef 宣言
型エイリアス宣言 (C++11)
キャスト
暗黙の変換 - 明示的な変換
static_cast - dynamic_cast
const_cast - reinterpret_cast
メモリ確保
クラス
クラス固有の関数特性
特別なメンバ関数
テンプレート
その他
 
 

名前探索は、プログラム内で名前に遭遇したときに、その名前を、それを導入した宣言に、紐付ける手続きです。

例えば、 std::cout << std::endl; をコンパイルするために、コンパイラは以下のことを行います。

  • 名前 std に対する非修飾名の名前探索。 これはヘッダ <iostream> 内の名前空間 std の宣言を発見します。
  • 名前 cout に対する修飾名の名前探索。 これは名前空間 std 内の変数の宣言を発見します。
  • 名前 endl に対する修飾名の名前探索。 これは名前空間 std 内の関数テンプレートの宣言を発見します。
  • 名前 operator << に対する実引数依存の名前探索および名前 std::ostream::operator<< に対する修飾名の名前探索。 前者は名前空間 std 内の複数の関数テンプレートの宣言を発見し、後者はクラス std::ostream 内の複数のメンバ関数の宣言を発見します。

関数および関数テンプレートの名前の場合、名前探索は同じ名前を持つ複数の宣言に紐付けることができ、実引数依存の名前探索から追加の宣言を取得することもあります。 テンプレートの実引数推定も適用されることがあり、そしてその宣言の集合がオーバーロード解決に渡され、使用される宣言が選択されます。 適用可能であれば、メンバアクセスルールが、名前探索およびオーバーロード解決の後にのみ、考慮されます。

他のすべての名前 (変数、名前空間、クラスなど) の場合、プログラムをコンパイルするためには、名前探索は単一の宣言を生成しなければなりません。 スコープ内の名前に対する探索は、その名前の宣言をすべて発見しますが、「構造体ハック」または 「型/非型隠蔽」と呼ばれる例外がひとつあります。 同じスコープ内で、ある名前に対するいくつかの出現がすべて同じ変数、非静的データメンバ (C++14以上)または列挙子を参照するか、それらがすべて関数または関数テンプレートの名前 (オーバーロードされていても構いません) を参照すると同時に、その同じ名前の他のすべての出現が typedef でないクラス/構造体/共用体/列挙の宣言を参照しても構いません。 この場合、エラーは発生しませんが、型名は名前探索から隠蔽されます (それにアクセスするためには複雑型指定子を使用しなければなりません)。

[編集] 名前探索の型

スコープ解決演算子 :: の直後 (または、 :: の後に曖昧性解消キーワード template が続く場合は、その後) に名前が現れる場合については、以下を参照してください。

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

[編集] 関連項目

名前探索および名前空間C言語リファレンス