在 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 会随着概念和要求的引入而改变吗?