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 で変更されますか?