C 语言允许从函数参数推断模板参数,但不允许从类构造函数推断模板参数。这可能会提出一个问题:为什么不允许构造函数进行这种推断?
不允许构造函数进行模板推断的一个原因是构造函数不是类的唯一入口点。复制构造函数和赋值运算符提供了创建类对象的其他方法。允许构造函数进行模板推断将要求编译器在确定模板参数时考虑所有这些入口点,这可能会导致语法歧义。
class MyClass { int a; int b; public: MyClass(int a, int b): a(a), b(b) {} };
在此示例中,如果允许构造函数进行模板推断,使用复制构造函数或赋值运算符创建 MyClass 对象时,不清楚应该使用哪些模板参数。
不允许模板推理的另一个原因对于构造函数来说,它可能会导致意外的行为。考虑以下代码:
class MyContainer { std::vector<T> vec; }; int main() { MyContainer<int> container; // explicitly specify template parameter MyContainer container2(vec); // infer template parameter from constructor }
在此示例中,可以使用显式指定的模板参数或特定类型的向量来构造 MyContainer 类。如果构造函数允许模板推断,则第二行代码将创建 T 类型的 MyContainer。但是,这可能不是预期的行为,因为用户可能想要创建 int 类型的 MyContainer。
由于这些问题,类构造函数不允许进行模板推断。然而,在 C 17 中,可以使用部分模板特化来实现类似的效果。部分模板特化允许用户为特定类型指定模板参数,同时保留其他模板参数进行推断。
template <typename T> class MyContainer { std::vector<T> vec; }; template <> class MyContainer<int> { std::vector<int> vec; }; int main() { MyContainer container; // infer template parameter to 'int' MyContainer<double> container2; // explicitly specify template parameter }
在此示例中,MyContainer 类具有 int 的部分模板特化。这意味着当使用 int 类型创建 MyContainer 时,模板参数将自动推断为 int。对于其他类型,必须显式指定模板参数。
以上是为什么 C 不允许构造函数进行模板参数推断?的详细内容。更多信息请关注PHP中文网其他相关文章!