c++ - enable_if not working in Visual Studio when using a constexpr function as argument -


i'm wrestling visual studio 2017 (compiling using /std:c++latest if that's help).

the code in question selects struct specialization based on result of templated constexpr function. gcc , clang have no trouble compiling it.

here's mcve:

#include <type_traits>  struct {   enum {     test_trait = true    }; };  template<typename t> constexpr int choose() {   return t::test_trait; }  template<typename t, typename enable=void> struct chosen;  template<typename t> struct chosen<t, std::enable_if_t<choose<t>() == 1>> {};  void foo() {   // works   constexpr int chosen = choose<a>();   static_assert(chosen == 1, "");    // resolves undefined struct.   using chosen_t = chosen<a>;   chosen_t x;   (void)x; } 

choose() fair bit more complex in codebase, static_assert still compiles, , checks fine.

i kinda assumed if static_assert compiles, there no reason enable_if not able magic. wrong? guess "maybe" t not technically dependant type of enable_if... if case, i'd expect gcc , clang slap wrist.

i can around wrapping result of choose() in std::integral_constant, so:

template<typename t>  struct chooser : public std::integral_constant<int, choose<t>()> {};  template<typename t> struct chosen<t, std::enable_if_t<chooser<t>::value>> {}; 

but i'd rather not have jump through hoop.

should template resolution able resolve way expect? i'm worried code wrong, , gcc , clang being lenient on me.


Comments

Popular posts from this blog

resizing Telegram inline keyboard -

command line - How can a Python program background itself? -

php - "cURL error 28: Resolving timed out" on Wordpress on Azure App Service on Linux -