問題は 2 つある可能性があります。そもそもなぜ 2 フェーズ ルックアップが必要なのか、2 フェーズ ルックアップがあるとすれば、トークンの解釈が最初のフェーズで修正されるのはなぜなのかということです。最初の質問は答えにくい質問です。これは言語の設計上の決定であり、長所と短所があり、立場に応じてどちらかが重要になるためです。
あなたが興味を持っている2番目の部分は、実際にはもっと単純です。なぜ、2 フェーズ ルックアップを使用する C++ 言語では、トークンの意味は最初のフェーズで固定され、2 番目のフェーズで解釈されるままにすることはできません。その理由は、C++ には文脈文法があり、トークンの解釈は文脈に大きく依存するためです。最初のフェーズでトークンの意味を固定しなければ、最初にどの名前を検索する必要があるかさえわかりません。
リテラル 5 が定数式に置き換えられている、元のコードのわずかに変更されたバージョンを考えてみてください。また、前回はあなたを苦しめたtemplate
orキーワードを提供する必要がなかったと仮定します。typename
const int b = 5;
template<typename T>
struct Derived : public Base<T> {
void Foo() {
Base<T>::Bar<false>(b); // [1]
std::cout << b; // [2]
}
};
[1] の可能な意味は何ですか (C++ では と を追加することによって決定されるという事実を無視しtypename
てtemplate
)
Bar
bool
単一のテンプレート引数と整数を引数として取る静的テンプレート関数です。b
定数 5 を参照する非依存の名前です。*
Bar
bool
テンプレート引数として1 つを受け取る、ネストされたテンプレート タイプです。b
関数内で定義され、Derived<T>::Foo
使用されていない型のインスタンスです。
Bar
を取り、結果として整数と比較できる型のオブジェクトを生成X
する比較がある型の静的メンバー変数です。operator<
bool
U
operator>
問題は、テンプレートの引数が代入される前に (つまり、最初のフェーズで)、名前の解決をどのように進めるかです。ケース 1. または 3. の場合は、b
検索する必要があり、結果を式に代入できます。最初のケースでは元のコードを生成します: Base<T>::template Bar<false>(5)
、後者のケースでは を生成しoperator>( operator<( Base<T>::Bar,false ), 5 )
ます。3 番目のケース (2.) では、最初のフェーズの後のコードは、元のコードとまったく同じになりますBase<T>::Bar<false> b;
(余分な を削除します()
)。
2 行目の意味 [2] は、最初の行をどのように解釈したかによって異なります [1]。2. の場合は への呼び出しを表しoperator<<( std::cout, Base<T>::Bar<false> & )
、他の 2 つの場合は を表しoperator<<( std::cout, 5 )
ます。2.b
内のケース名Derived<T>::Foo
が依存しているように、2 番目の引数の型を超えて影響が及ぶため、最初のフェーズでは解決できず、2 番目のフェーズに延期されます (2 番目の引数を追加することで検索にも影響します)の名前空間Base
とインスタンス化する型T
を Argument Dependent Lookup に渡します)。
例が示すように、トークンの解釈は名前の意味に影響を与え、それはコードの残りの部分の意味、どの名前が依存しているかどうか、したがって最初の実行中に他に何を調べる必要があるかどうかに影響します。段階。同時に、コンパイラは最初のパスでチェックを実行し、2 番目のパスでトークンを再解釈できる場合、最初のパスでのチェックとルックアップの結果は役に立たなくなります (最初のパスでそれを想像してください)。 passb
は、第 2 フェーズでケース 2 にあることを確認するためだけに置き換えられ5
ました!)、第 2 フェーズですべてをチェックする必要があります。
2 フェーズ ルックアップの存在は、解釈されるトークンと、最初のフェーズで選択された意味に依存します。代替手段は、VS のようにシングル パス ルックアップです。
*ここではケースを単純化しています。2 フェーズ ルックアップを実装していない Visual Studio コンパイラでは、現在インスタンス化されている型のb
メンバーになることもできます(つまり、依存名になる可能性があります)。Base<T>
T