构造函数参数的模板推断:探索局限性
在 C 中,模板参数可以从函数参数推断出来,从而简洁直观代码。然而,相同的功能不适用于类构造函数,从而引发了有关其基本原理的问题。
关键区别在于一个类可能有多个入口点。与具有单个定义入口点的函数不同,构造函数可以通过复制构造函数和赋值运算符进行补充。如果构造函数允许模板推断,则通过这些替代入口点构造对象时会出现歧义。
考虑以下示例:
template <typename obj> class Variable { obj data; public: Variable(obj d) { data = d; } }; int main() { int num = 2; Variable var(num); // interpreted as Variable<int> var(num) Variable other; // ambiguous: which template parameter type is inferred? other = var; // constructs via assignment operator, potentially causing inference issues return 0; }
在这种情况下,从以下位置推断模板参数类型var 的构造函数参数很简单。然而,当尝试使用 other 的默认构造函数并随后将 var 分配给它时,应该推断出什么模板参数类型就变得不清楚了。如果定义了 var 和 other 的复制因子,也会出现同样的问题,从而导致潜在的混乱和错误。
此外,在某些情况下推断模板参数类型可能是不可取的。考虑一个接受类模板作为参数的通用函数。如果允许推理,则很难显式指定模板参数类型,从而可能限制函数的灵活性。
总之,虽然类构造函数的模板推理最初看起来很有吸引力,但它所面临的挑战和歧义带来的好处超过了其潜在的好处。现有方法允许显式指定模板参数,提供更高的清晰度并避免潜在的推理问题。
以上是为什么 C 不支持类构造函数的模板参数推断?的详细内容。更多信息请关注PHP中文网其他相关文章!