Missing description of class SFINAE
13.10.3 [temp.deduct]
Ville Voutilainen

Created on 2014-12-07.00:00:00 last changed 1 month ago


Date: 2023-11-08.22:44:02

Proposed resolution (approved by CWG 2023-11-08):

Change in [temp.deduct.general] paragraph 7 as follows:

The deduction substitution loci are
  • the function type outside of the noexcept-specifier,
  • the explicit-specifier, and
  • the template parameter declarations., and
  • the template argument list of a partial specialization ( [temp.spec.partial.general]).
The substitution occurs in all types and expressions that are used in the deduction substitution loci. ...
Date: 2023-01-15.00:00:00

Additional notes (January, 2023)

The section on SFINAE ( [temp.deduct.general] paragraph 8) is not specific to function templates, and [temp.spec.partial.match] paragraph 2 hands off the "matching" determination for partial specializations to 13.10.3 [temp.deduct] in general. However, the definition of deduction substitution loci in [temp.deduct.general] paragraph 7 does not account for the template argument list of a partial specialization.

Date: 2017-02-06.00:00:00

Presumably something like the following should be well-formed, where a deduction failure in a partial specialization is handled as a SFINAE case as it is with function templates and not a hard error:

  template <class T, class U> struct X   {
    typedef char member;

  template<class T> struct X<T,
   typename enable_if<(sizeof(T)>sizeof(
     float)), float>::type>
    typedef long long member;

  int main() {
    cout << sizeof(X<double, float>::member);

However, this does not appear to be described anywhere in the Standard.

Date User Action Args
2023-11-08 22:44:02adminsetmessages: + msg7501
2023-11-08 22:44:02adminsetstatus: review -> ready
2023-01-28 10:22:40adminsetmessages: + msg7156
2023-01-28 10:22:40adminsetstatus: open -> review
2014-12-07 00:00:00admincreate