Ermöglichen nicht abhängige Standardvorlagenargumente von Funktionsvorlagen SFINAE?

Mit "nicht abhängig" meine ich hier "nicht abhängig von irgendwelchen anderen Vorlagenargumenten dieser spezifischen Funktionsvorlage".

Während der Beantwortungdiese FrageIch dachte, ich hätte die Antwort gefunden, aber laut @Johannes (in den Kommentaren zu meiner Antwort) interpretiere ich den Standard hier falsch. Nehmen Sie das folgende einfache Beispiel:

#include <type_traits>

template<class T>
struct X{
  template<class U = typename T::type>
  static void foo(int){}
  static void foo(...){}
};

int main(){
  X<std::enable_if<false>>::foo(0);
}

(Live-Version.)

Gibt es eine Garantie dafür, dass die oben genannten kompiliert werden? GCC und Clang sind sich hier nicht einig, wie in der Live-Version beim Wechsel zwischen ihnen zu sehen ist. Interessanterweise wird jedoch Folgendes von GCC akzeptiert:

#include <type_traits>

template<class T>
struct X{
  template<bool = T::f()>
  static void foo(int){}
  static void foo(...){}
};

struct Y{
  static bool f(){ return true; }
};

int main(){
  X<Y>::foo(0);
}

(Live-Version.)

Das zweite Snippet wird nur gedrucktfoo(int) obT enthält einconstexpr statische Funktionf. Wieder interessant, wenn Sie vollständig entfernenf vonY (oder pass, sagen wir,int Stattdessen beschwert sich GCC über ein fehlendes Mitglied und gibt an, dass SFINAE nicht zulässig ist - was im Widerspruch zur vorherigen Beobachtung steht. Clang nimmt alle Variationen und wendet SFINAE an, und ich frage mich, ob der Standard dies garantiert.

(FWIW, MSVC mit dem Nov CTP stimmt im Allgemeinen mit Clang überein, stürzt jedoch beim zweiten Snippet ab, wenn die Funktion vorhanden ist, wahrscheinlich, weil sie nicht vorhanden istconstexpr. Ich habe einen Fehlerbericht eingereichtHier.)

Antworten auf die Frage(1)

Ihre Antwort auf die Frage