为什么hana的is_valid_t SFINAE测试使用std :: declval <f &&>()不使用std :: declval <f>()?

时间:2017-09-15 02:21:41

标签: c++ c++11 c++14 c++17

这是hana is_void impl代码:

 namespace type_detail {
        template <typename F, typename ...Args, typename = decltype(
            std::declval<F&&>()(std::declval<Args&&>()...)
        )>
        constexpr auto is_valid_impl(int) { return hana::true_c; }

        template <typename F, typename ...Args>
        constexpr auto is_valid_impl(...) { return hana::false_c; }

        template <typename F>
        struct is_valid_fun {
            template <typename ...Args>
            constexpr auto operator()(Args&& ...) const
            { return is_valid_impl<F, Args&&...>(int{}); }
        };
    }

    //! @cond
    template <typename F>
    constexpr auto is_valid_t::operator()(F&&) const
    { return type_detail::is_valid_fun<F&&>{}; }

因为is_void_t接受F&amp;&amp;,type_detail::is_valid_fun<F&&>然后is_valid_fun的模板arg是F&amp;&amp;,然后is_valid_impl的模板arg是F&amp;&amp;

...为什么使用std::declval<F&&>()(std::declval<Args&&>()...)而不仅仅使用std::declval<F>()(std::declval<Args>()...)

0 个答案:

没有答案