Rilevare constexpr con SFINAE

Sto lavorando per aggiornare alcuni codici C ++ per sfruttare le nuove funzionalità in C ++ 11. Ho una class dei caratteri con alcune funzioni che restituiscono tipi fondamentali che, nella maggior parte dei casi, potrebbero restituire un’espressione costante, ma non sempre. Mi piacerebbe fare cose diverse in base al fatto che la funzione sia constexpr o meno. Ho trovato il seguente approccio:

 template struct test { template 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::call() << std::endl; std::cout << "constexpr: " << test::call() << std::endl; } 

Il parametro extra int / ... è lì in modo che se entrambe le funzioni sono disponibili dopo SFINAE , il primo viene scelto dalla risoluzione di sovraccarico.

La compilazione e l’esecuzione di questo con Clang 3.2 mostra:

 regular: 0 constexpr: 1 

Quindi sembra funzionare, ma mi piacerebbe sapere se il codice è legale C ++ 11. Specialmente visto che capisco che le regole di SFINAE sono cambiate.