43

名前解決(オーバーロードを含む)を実行するために C++ 準拠のコンパイラが適用する必要がある規則のリストはどこにありますか?

自然言語のアルゴリズムやフローチャートのようなものが欲しいです。

もちろん、C++ 標準にはこの一連のルールがありますが、新しい言語ステートメントが導入されるにつれて構築され、その結果を覚えるのはかなり困難です。

長い話を手短に言うと、「名前 'A' を見たときにコンパイラは何をするのか?」という質問に対する完全かつ詳細な答えを知りたいです。

C++ はすべて「 X の場合はこれを行い、Z が成立する場合は Y を行わない」ことを知っているので、より線形にすることが可能かどうかを尋ねています。

編集:私はこのトピックのドラフトに取り組んでいます。これは、投稿されるとまとめて改善される可能性があります。しかし、今日はとても忙しいので、何か公開できるようになるまでには時間がかかるかもしれません。誰かが興味を持っている場合は、「生のtxtファイルに関する個人的なメモ」をより良いものに昇格させて投稿します.

4

1 に答える 1

12

まあ、広いストロークで:

  • またはの::ように、名前の前に。が付いている場合は、修飾名ルックアップを使用します。最初に検索し、存在する場合(グローバル名前空間を使用しない場合)、内部を検索します。がクラスであり、直接メンバーではない場合は、のすべての直接ベースを調べます。複数の拠点で見つかった場合は、失敗します。::AX::AXAXAXA

  • それ以外の場合、名前がなどの関数呼び出しとして使用される場合は、引数依存のルックアップA( X )を使用します。これは難しい部分です。のタイプが宣言された名前空間、のフレンド、およびテンプレートのインスタンス化の場合は、関連するすべての引数を探します。によってのみ関連付けられたスコープは適用されません。修飾されていないルックアップに加えてこれを行います。AXXXtypedef

  • 引数依存のルックアップが適用されない場合は、修飾されていないルックアップから始めます。これは、変数が見つかる通常の方法です。現在のスコープから開始し、名前が見つかるまで外側に向かって作業します。これはusing namespaceディレクティブを尊重しますが、他の2つのケースはそうではないことに注意してください。

標準を一瞥するだけで、多くの例外と落とし穴が明らかになります。たとえば、修飾されていないルックアップは、ADLを使用して潜在的なオーバーロードのリストを生成する前に、名前がキャスト式ではなく関数呼び出しとして使用されているかどうかを判断するために使用されます。非修飾ルックアップは、ローカルクラスのネストされたスコープを囲むオブジェクトを検索しません。これは、そのようなオブジェクトが参照時に存在しない可能性があるためです。

常識を適用し、直感が失敗した場合は、より具体的な質問をします。

于 2011-09-11T03:56:12.407 に答える