Wykrywanie constexpr za pomocą SFINAE

Pracuję nad aktualizacją kodu C ++, aby skorzystać z nowej funkcjonalności w C ++ 11. Mam klasę cech z kilkoma funkcjami zwracającymi podstawowe typy, które przez większość czasu, ale nie zawsze, zwracają stałe wyrażenie. Chciałbym robić różne rzeczy w zależności od tego, czy funkcja jestconstexpr albo nie. Wymyśliłem następujące podejście:

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;
}

Statystaint/... parametr jest tak, że jeśli obie funkcje są dostępne poSFINAE, pierwszy zostanie wybrany przez przeładowanie rozdzielczości.

Kompilowanie i uruchamianie za pomocąClang 3.2 przedstawia:

regular: 0
constexpr: 1

To wydaje się działać, ale chciałbym wiedzieć, czy kod jest zgodny z C ++ 11. Specjalnie dlatego, że moje zrozumienie zasadSFINAE zmienił się.

questionAnswers(2)

yourAnswerToTheQuestion