C++準拠のコンパイラが実行するために適用しなければならない規則のリストはどこで見つけられますか?名前解決(オーバーロードを含む)?
自然言語アルゴリズムやフローチャートのようなものが欲しいです。
もちろん、C++ 標準にはこの一連のルールがありますが、新しい言語ステートメントが導入されるたびにルールが構築されるため、覚えるのが非常に難しくなります。
長い話を短くすると、私は「コンパイラは「A」という名前を見たときに何をするか???
C++はすべて「Xの場合はこれを実行し、Zが成立する場合はYは実行しない「それで、もっと直線的にできるかどうか尋ねているんです。
編集: 私はこのトピックの草稿に取り組んでいます。投稿後にまとめて改善される可能性があります。ただし、最近は非常に忙しいため、公開できるものになるまでに時間がかかる可能性があります。興味がある方がいらっしゃれば、「生の txt ファイルに関する個人メモ」をより良いものに昇格させて投稿します。
ベストアンサー1
まあ、大まかに言うと:
またはの
::
ように名前の前に が付く場合は、::A
X::A
修飾名検索最初に を検索しX
、存在する場合は (存在しない場合はグローバル名前空間を使用)、 の内部を検索しますA
。 がX
クラスであり、A
直接のメンバーでない場合は、 のすべての直接ベースを検索しますX
。A
が複数のベースで見つかった場合は失敗します。それ以外の場合、名前が関数呼び出しとして使用される場合には
A( X )
、次のように使用します。引数依存検索。ここが難しいところです。A
の型が宣言された名前空間でを検索しX
、 のフレンドで を検索しX
、 がX
テンプレートのインスタンス化である場合は、関連するすべての引数について同様に検索します。 によってのみ関連付けられているスコープはtypedef
適用されません。これを、非修飾検索に加えて実行します。皮切りに非限定的な検索引数依存の検索が適用されない場合。これは変数が見つかる通常の方法です。現在のスコープから始めて、名前が見つかるまで外側に向かって作業します。これは
using namespace
ディレクティブを尊重しますが、他の 2 つのケースでは尊重されないことに注意してください。
標準をざっと見るだけでも、多くの例外や落とし穴が見つかります。例えば、無条件検索は、かどうか名前は、ADL を使用して潜在的なオーバーロードのリストを生成する前に、キャスト式ではなく関数呼び出しとして使用されます。非修飾検索では、ネストされたローカル クラスの囲みスコープ内のオブジェクトは検索されません。これは、参照時にそのようなオブジェクトが存在しない可能性があるためです。
常識を働かせて、直感がうまく働かない場合は(よくあることですが)、より具体的な質問をしてください。