在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();
}
Run Code Online (Sandbox Code Playgroud)
这段代码编译,我可以使用b,只要我不试图打电话b.call_f().(还显式实例化它template class Wrapper<B>;会导致编译错误,因为它会实例化所有成员函数.)
这是保证工作还是未定义的行为?如果是这样,那么随着概念和要求的引入,这将在C++ 17中发生变化吗?