Обнаружение constexpr с SFINAE

Я работаю над обновлением некоторого кода C ++, чтобы использовать преимущества новой функциональности в C ++ 11. У меня есть класс черт с несколькими функциями, возвращающими фундаментальные типы, которые большую часть времени, но не всегда, возвращают константное выражение. Я хотел бы делать разные вещи в зависимости от того, является ли функцияconstexpr или нет. Я придумал следующий подход:

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

Экстраint/...&nbsp;параметр есть, так что если обе функции доступны послеSFINAEпервый выбирается путем перегрузки разрешения.

Компилируем и запускаем это сЛязг 3,2&nbsp;показывает:

regular: 0
constexpr: 1

Так что, похоже, это работает, но я хотел бы знать, является ли код легальным C ++ 11. Тем более, что я понимаю, что правилаSFINAE&nbsp;были изменены.