Detectando constexpr com SFINAE

Estou trabalhando na atualização de alguns códigos C ++ para aproveitar a nova funcionalidade do C ++ 11. Eu tenho uma classe de traço com algumas funções retornando tipos fundamentais que na maioria das vezes, mas nem sempre, retornam uma expressão constante. Eu gostaria de fazer coisas diferentes com base em se a função éconstexpr ou não. Eu criei a seguinte abordagem:

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

O Extraint/... parâmetro está lá para que, se ambas as funções estão disponíveis depoisSFINAE, o primeiro é escolhido pela sobrecarga de resolução.

Compilando e executando isso comClang 3.2 mostra:

regular: 0
constexpr: 1

Então, isso parece funcionar, mas eu gostaria de saber se o código é legal C ++ 11. Especialmente desde que eu entendo que as regras paraSFINAE mudou.

questionAnswers(2)

yourAnswerToTheQuestion