15

xご存知のように、メンバーが依存基底クラスにあるため、以下のコードは形式が正しくありません。ただし、指定された行に変更xするthis->xとエラーが修正されます。

template <typename T>
struct B {
    int x;
};
template <typename T>
struct C : B<T> {
    void f() {
        int y = x; // Error!
    }
};
int main() {
    C<int> c;
    c.f();
}

この動作が標準でどのように指定されているかについて説明をお願いします。[temp.dep]/3 によると:

クラスまたはクラス テンプレートの定義で、基本クラスがテンプレート パラメーターに依存している場合、クラス テンプレートまたはメンバーの定義時点での非修飾名ルックアップ中、またはクラス テンプレートまたはクラス テンプレートのインスタンス化中のいずれかで、基本クラス スコープは検査されません。クラス テンプレートまたはメンバー。

xこれは、単独で使用すると失敗する理由を説明しているようです。名前xは定義の時点で調べられ、基本クラスのスコープは調べられません。しかし、 を使用するとどうなるthis->xでしょうか? 現在、名前xは依存しており、そのルックアップはインスタンス化まで延期されています。しかし、引用されたパラグラフは、 inのルックアップがまだ修飾されていないルックアップであるため、インスタンス化の時点でもそれをx見つけてはならないことを暗示しているようです。xthis->x

実装がこのように動作しないことは明らかであり、テンプレートがインスタンス化されると基本クラスのスコープ検索されることは広く理解されています。

  1. 引用された段落を誤解しましたか?
  2. 「正しい」動作を指定する段落はありますか?
4

1 に答える 1

7

クラス メンバー アクセス式 (5.2.5. [expr.ref]) は、非修飾ルックアップ ルールを使用せず、クラス メンバー アクセス ルックアップ ルール (3.4.5 [basic.lookup.classref]) を使用します。

(2) クラス メンバ アクセス (5.2.5) のid-expressionが unqualified-id であり、オブジェクト式の型が class typeCである場合、unqualified-id は class のスコープで検索されCます。

于 2015-09-19T07:44:40.673 に答える