struct Value {
using a_type = int;
a_type f() { return 1; }
};
template<typename T>
struct Wrapper {
T t;
auto call_f() { return t.f(); }
};
int main() {
Wrapper<Value> w;
Wrapper<int> w2;
w.call_f();
}
这在Clang和GCC上编译良好。Wrapper<int>
即使Wrapper<int>::call_f()
无法推断出的返回类型(没有int::f()
)也被实例化。它只有在w2.call_f()
被调用时才会失败。
这是C ++标准的一部分,可以预期在所有编译器上都可以使用吗?
是的,这是C ++标准的一部分。
模板实例化的规则很长很复杂,但是简短的版本是模板类的成员函数仅在需要时才实例化。如果没有任何东西调用它,或者试图获取指向它的指针,或者显式实例化它(可能还有其他一些我忘记的情况),那么它将不会被实例化并且您的代码格式正确。
正如@dyp所指出的,只有在实例化类定义()时实例化成员函数的声明[temp.inst]/1
,而返回类型推论仅在实例化函数定义([dcl.spec.auto]/12
)时进行。
这对于最小化模板的开销以及允许类型要求都是非常有用的。通过此功能,您可以执行以下操作:
struct Foo {
//no default constructor
Foo(int);
};
std::vector<Foo> foos;
某些std::vector
功能(resize
例如)需要T
默认可构造,但只要不调用这些功能,您仍可以使用的其他功能std::vector
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句