名前空間
変種
操作

名前探索

From cppreference.com
< cpp‎ | language
 
 
C++言語
全般
フロー制御
条件実行文
if
繰り返し文 (ループ)
for
範囲for (C++11)
ジャンプ文
関数
関数宣言
ラムダ式
inline指定子
動的例外仕様 (C++17まで*)
noexcept指定子 (C++11)
例外
名前空間
指定子
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点数
文字 - 文字列 - nullptr (C++11)
ユーザー定義 (C++11)
ユーティリティ
属性 (C++11)
typedef宣言
型エイリアス宣言 (C++11)
キャスト
メモリ確保
クラス
クラス固有の関数プロパティ
explicit (C++11)
static

特殊メンバ関数
テンプレート
その他
 
 

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

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

  • stdという名前に対する非修飾名探索。これによりヘッダ <iostream> 内の名前空間 std の宣言が見つかります。
  • coutという名前に対する修飾名探索。これにより名前空間 std 内の変数宣言が見つかります。
  • endlという名前に対する修飾名探索。これにより名前空間 std 内の関数テンプレート宣言が見つかります。
  • operator<< という名前に対する実引数依存の名前探索。これにより名前空間 std 内の複数の関数テンプレート宣言が見つかります。また、std::ostream::operator<< という名前に対する修飾名探索も行われ、これによりクラス std::ostream 内の複数のメンバ関数宣言が見つかります。

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

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

[編集] 探索の種類

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

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

[編集] 欠陥報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
CWG 2063 C++98 「struct ハック」がクラススコープに適用されなかった(Cとの互換性を壊す) 適用済み
CWG 2218 C++98 非関数(テンプレート)名の探索が、複数の宣言を関連付けられなかった
たとえそれらが同じ実体を宣言していても
許可

[編集] 関連項目

C ドキュメント名前探索と名前空間
English 日本語 中文(简体) 中文(繁體)