Title
Newly-ambiguous variadic template expansions
Status
open
Section
13.7.4 [temp.variadic]
Submitter
Daniel Krügler

Created on 2011-12-17.00:00:00 last changed 2 days ago

Messages

Date: 2025-03-15.00:00:00

Additional notes (March, 2025)

Issue 1395 covers only function parameter packs, but the example in the present issue does not have any. Reopening the issue for further consideration. See also 13.10.3.6 [temp.deduct.type] bullet 9.1.

Date: 2022-11-20.07:54:16

CWG 2022-11-11

Resolved by issue 1395; see the special rule about trailing packs in 13.10.3.5 [temp.deduct.partial] paragraph 11.

Date: 2012-10-15.00:00:00

Notes from the October, 2012 meeting:

It is possible that 13.7.6.3 [temp.spec.partial.order] may resolve this problem.

Date: 2025-03-02.07:17:22

With the new core rules in regard to variadic pack expansions the library specification of the traits template common_type is now broken, the reason is that it is defined as a series of specializations of the primary template

    template <class ...T>
    struct common_type;

The broken one is this pair:

  template <class T, class U>
  struct common_type<T, U> {
   typedef decltype(true ? declval<T>() : declval<U>()) type;
  };

  template <class T, class U, class... V>
  struct common_type<T, U, V...> {
   typedef typename common_type<typename common_type<T, U>::type, V...>::type type;
  };

With the new rules both specializations would now be ambiguous for an instantiation like common_type<X, Y>.

(See also issue 1395.)

History
Date User Action Args
2025-03-02 07:17:22adminsetmessages: + msg7973
2025-03-02 07:17:22adminsetstatus: c++17 -> open
2022-11-20 07:54:16adminsetmessages: + msg7033
2022-11-20 07:54:16adminsetstatus: open -> c++17
2022-02-18 07:47:23adminsetstatus: drafting -> open
2012-11-03 00:00:00adminsetmessages: + msg4104
2012-11-03 00:00:00adminsetstatus: open -> drafting
2011-12-17 00:00:00admincreate