In C , template parameters can be inferred from function parameters, allowing for convenient type deduction. However, this inference does not extend to class constructors.
Reason:
The lack of inference for class constructors stems from the fact that a constructor is not the only entry point for a class. Copy constructors and assignment operators can also manipulate objects without having explicit information about the template parameters.
Consider the following example:
MyClass m(string s); MyClass *pm; *pm = m;
In this scenario, it is difficult for the compiler to determine the template parameter for pm, as both m and pm lack this information. Therefore, allowing inference for class constructors would introduce uncertainty and syntactic difficulties.
Exceptions in C 17:
In C 17, an exception to this rule was introduced. For certain types, such as std::pair and std::tuple, template parameters can be inferred from constructor arguments.
When Inference Is Undesirable:
In some cases, inferring template parameters from constructors may not be desirable. Consider a class that uses default template parameters, which the constructor may not override. If inference were allowed, it could potentially override the default values and lead to unexpected behavior.
Therefore, while template parameter inference for function parameters enhances code conciseness, the absence of such inference for class constructors ensures clarity and prevents potential ambiguities in class usage.
The above is the detailed content of Why Can't C Template Parameters Be Inferred from Class Constructors, Unlike Functions?. For more information, please follow other related articles on the PHP Chinese website!