La substitution est-elle effectuée sur un type de pack de parameters variadiques si le pack est vide?

Considérez le programme suivant:

#include  enum class dummy {}; template  using EnableIf = typename std::enable_if::type; template  using DisableIf = typename std::enable_if::type; template  struct dependent_true_type : std::true_type {}; template <typename T, EnableIf<dependent_true_type>...> std::true_type f(); template <typename T, DisableIf<dependent_true_type>...> std::false_type f(); static_assert(decltype(f())::value, ""); int main() {} 

GCC 4.7 accepte volontiers ce programme. Ma récente version 3.1 de Clang affirme que l’appel à f est ambigu.

 test.c++:22:24: fatal error: call to 'f' is ambiguous static_assert(decltype(f())::value, ""); ^~~~~~ test.c++:17:16: note: candidate function [with T = int, $1 = ] std::true_type f(); ^ test.c++:20:17: note: candidate function [with T = int, $1 = ] std::false_type f(); ^ 1 error generated. 

Il accepte le programme si j’écris f() .

Il semble que clang ne considère pas le type du pack de parameters lorsque celui-ci est vide, ce qui conduit à ne pas le supprimer de l’ensemble des candidats. GCC semble effectuer une substitution sur le type de paquet de parameters même si le paquet est vide, et puisque cette substitution échoue pour une surcharge, il n’y a pas d’ambiguïté.

Lequel des deux est correct?

Je crois avoir trouvé la pièce de texte pertinente. Le paragraphe 14.8.2p7 dit:

La substitution se produit dans tous les types et expressions utilisés dans le type de fonction et dans les déclarations de paramètre de modèle.

Puisque EnableIf> est utilisé dans une déclaration de paramètre de modèle, une substitution doit avoir lieu et il s’agit d’ un bogue dans clang .