Title
Implicit deduction guides should propagate constraints
Status
open
Section
12.2.2.9 [over.match.class.deduct]
Submitter
Roy Jacobson

Created on 2022-09-11.00:00:00 last changed 2 weeks ago

Messages

Date: 2022-09-11.00:00:00

Consider:

template<class T> concept True = true;

template<class T> struct X {
  template<class U> requires True<T> X(T, U(&)[3]);
};
template<typename T, typename U> X(T, U(&)[3]) -> X<T>;
int arr3[3];
X z(3, arr3);     // #1

According to 12.2.2.9 [over.match.class.deduct] bullet 1.1, the requires-clause of the constructor is not propagated to the function template synthesized for the implicit deduction guide, making the implicit deduction guide ambiguous with the user-provided one. The example ought to be valid.

Possible resolution:

Change in 12.2.2.9 [over.match.class.deduct] bullet 1.1 as follows:

  • If C is defined, for each constructor of C, a function template with the following properties:
    • The template parameters are the template parameters of C followed by the template parameters (including default template arguments) of the constructor, if any.
    • The associated constraints (13.5.3 [temp.constr.decl]) are the conjunction of the associated constraints of C and the associated constraints of the constructor.
    • The types of the function parameters are those of the constructor.
    • The return type is the class template specialization designated by C and template arguments corresponding to the template parameters of C.
History
Date User Action Args
2022-09-11 00:00:00admincreate