Class template argument deduction for aggregates with designated initializers
Section [over.match.class.deduct]
Christof Meerwald

Created on 2023-01-09.00:00:00 last changed 2 weeks ago


Date: 2023-01-14.21:59:47

Suggested resolution:

  1. Change in [over.match.class.deduct] paragraph 1 as follows:

    ... If the initializer has a designated-initializer-list, any guide that is not an aggregate deduction candidate is not viable; for an aggregate deduction candidate, the designated-initializer-list is replaced by an initializer-list with the same elements. In addition, if C is defined and inherits constructors (9.9 [namespace.udecl]) from a direct base class ...
  2. Change in [over.match.class.deduct] bullet 3.5 as follows:

    • ...
    • If f was generated from a deduction-guide ( [temp.deduct.guide]), then f' is considered to be so as well.
    • If f was generated from an aggregate deduction guide, then f' is considered to be so as well.
Date: 2023-01-09.00:00:00


   template<typename T>
   struct X
    int i{};
    T t;

   X x{ .t = X<int>{ 1, 2 } }; // should deduce X<X<int>> (not X<int>)


   template<typename T>
   struct Y
    int i;
    T t;
    int j;

   template<typename T>
   Y(int, T) -> Y<T>;

   Y y{ .t = 'c', .j = 2 }; // should be ill-formed

Class template argument deduction does not limit deduction to the aggregate deduction candidate when a designated initializer list is used.

Date User Action Args
2023-01-14 21:59:47adminsetmessages: + msg7130
2023-01-09 00:00:00admincreate