2

C++ では、メンバー関数の一部で動作しないクラスでクラス テンプレートをインスタンス化することは合法ですか?

例えば:

class A {
public:
    void f() { }
};

class B {  
};

template<typename T>
class Wrapper {
private:
    T t_;
public:
    void call_f() { t_.f(); }
};

int main() {
    Wrapper<A> a;
    Wrapper<B> b;
    a.call_f();
}

このコードはコンパイルされ、bを呼び出さない限り、 を使用できますb.call_f()。(また、明示的にインスタンス化するとtemplate class Wrapper<B>;、すべてのメンバー関数がインスタンス化されるため、コンパイル エラーが発生します。)

これは動作することが保証されていますか、それとも未定義の動作ですか? もしそうなら、概念と要件の導入により、これは C++17 で変更されますか?

4

2 に答える 2

1

これは標準的な動作であり、変更されません。

その理由は次のとおりです。テンプレートは、さまざまな型引数を処理する必要がある汎用コードです。テンプレート化されたコードの一部の操作は、あるタイプ ( on など) では完全に有効ですが、別のタイプ ( call_fonAなど) ではひどく間違っている場合がcall_fありBます。標準で下された決定は、このテンプレート関数が使用されない限り (テンプレート関数のコンパイルがトリガーされる) 、 call_ffor 型などの無意味なテンプレート コードを許可することでした。B

こうすることで、これらのチェックがコンパイル時に行われるため、コードを汎用的かつ安全にすることができます。

于 2015-05-17T18:10:24.720 に答える