Detecting constexpr with SFINAE

前端 未结 2 1727
無奈伤痛
無奈伤痛 2020-11-27 04:57

I\'m working on upgrading some C++ code to take advantage of the new functionality in C++11. I have a trait class with a few functions returning fundamental types which woul

2条回答
  •  情话喂你
    2020-11-27 05:38

    NOTE: I opened a question here about whether OPs code is actually valid. My rewritten example below will work in any case.


    but I would like to know if the code is legal C++11

    It is, although the default template argument may be considered a bit unusual. I personally like the following style better, which is similar to how you (read: I) write a trait to check for a function's existence, just using a non-type template parameter and leaving out the decltype:

    #include 
    
    namespace detail{
    template struct sfinae_true : std::true_type{};
    template
    sfinae_true<(T::f(), 0)> check(int);
    template
    std::false_type check(...);
    } // detail::
    
    template
    struct has_constexpr_f : decltype(detail::check(0)){};
    

    Live example.


    Explanation time~

    Your original code works because a default template argument's point of instantiation is the point of instantiation of its function template, meaning, in your case, in main, so it can't be substituted earlier than that.

    §14.6.4.1 [temp.point] p2

    If a function template [...] is called in a way which uses the definition of a default argument of that function template [...], the point of instantiation of the default argument is the point of instantiation of the function template [...].

    After that, it's just usual SFINAE rules.


    † Atleast I think so, it's not entirely clear in the standard.

提交回复
热议问题