Class Constructor Template Inference Controversy
Template parameters can be conveniently inferred from function arguments, as in the following code:
template <typename T> void swap(T& a, T& b) { T temp = a; a = b; b = temp; }
However, a similar approach is not allowed for class constructors, which has raised questions among C programmers. Why not?
The reason behind this inconsistency lies in the complexities of object construction. Constructors are not the only entry point for a class. Copy constructors and assignment operators also play vital roles, and inferring template parameters from only the constructor could lead to ambiguities.
Consider the following example:
template <typename T> class Variable { T data; public: Variable(T d) { data = d; } };
If template inference were allowed, the following code would be valid:
Variable var(2); // Equivalent to Variable<int> var(2);
But what if we used copy construction or assignment operators?
MyClass m(string s); MyClass *pm; *pm = m;
In this case, it would be challenging for the compiler to determine the template type of MyClass pm.
To alleviate this issue, C 17 introduced type deduction from constructor arguments. This allows template parameters to be inferred from constructor parameters, eliminating the need for explicit type arguments in certain situations. For example:
std::pair p(2, 4.5); // Inferred as std::pair<int, double> p(2, 4.5); std::tuple t(4, 3, 2.5); // Inferred as std::tuple<int, int, double> t(4, 3, 2.5);
It's important to note that this inference feature is still under development and may be subject to modifications in future C standards. Nevertheless, it marks a significant step towards simplifying code and improving type safety.
The above is the detailed content of Why Can't C Template Parameters Be Inferred for Class Constructors Like Function Templates?. For more information, please follow other related articles on the PHP Chinese website!