Erkennen von Constexpr mit SFINAE

Ich arbeite daran, C ++ - Code zu aktualisieren, um die neuen Funktionen in C ++ 11 zu nutzen. Ich habe eine Trait-Klasse mit einigen Funktionen, die grundlegende Typen zurückgeben, die die meiste Zeit, aber nicht immer, einen konstanten Ausdruck zurückgeben würden. Ich möchte verschiedene Dinge tun, je nachdem, ob die Funktion istconstexpr oder nicht. Ich habe mir folgenden Ansatz ausgedacht:

template<typename Trait>
struct test
{
    template<int Value = Trait::f()>
    static std::true_type do_call(int){ return std::true_type(); }

    static std::false_type do_call(...){ return std::false_type(); }

    static bool call(){ return do_call(0); }
};

struct trait
{
    static int f(){ return 15; }
};

struct ctrait
{
    static constexpr int f(){ return 20; }
};

int main()
{
   std::cout << "regular: " << test<trait>::call() << std::endl;
   std::cout << "constexpr: " << test<ctrait>::call() << std::endl;
}

Das Extraint/... Parameter gibt es also, wenn beide Funktionen danach verfügbar sindSFINAEwird der erste durch Überladen der Auflösung ausgewählt.

Kompilieren und ausführen mitClang 3.2 zeigt an:

regular: 0
constexpr: 1

Das scheint also zu funktionieren, aber ich würde gerne wissen, ob der Code legal ist C ++ 11. Vor allem, da ich verstehe, dass die Regeln fürSFINAE geändert haben.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage