c – 以尾随返回类型进行转换会导致SFINAE失败

我已经重新实现了boost :: hana :: is_valid用于学习目的.用例是:

struct Person {
    std::string name;
};

int main()
{
    auto has_name = is_valid([](auto&& t) -> decltype((void) t.name) {});

    Person jon{"snow"};
    static_assert(has_name(jon), "");
    static_assert(!has_name(1), "");
}

执行:

namespace detail {

template<typename F>
struct is_valid_impl {
    template<typename T, typename = std::result_of_t<F&&(T&&)>>
    constexpr bool operator()(T&&) const noexcept { return true; }

    constexpr bool operator()(...) const noexcept { return false; }
};

}  // namespace detail

template<typename F>
constexpr auto is_valid(F&&)
{
    return detail::is_valid_impl<F>{};
}

但是,我不知道为什么Hana的用户指南建议将所需成员的类型转换为无效(参见here);我们不能只使用decltype(t.name)而不是decltype((void)t.name)?

此外,铸造到空隙导致GCC中的测试结果为fail. 5.3,而没有演员代码works为GCC 5.1.可能是什么原因?

最佳答案 不能比文档更明确:

@snippet example/tutorial/introspection.cpp non_static_member_from_object

Notice how we cast the result of x.member to void? This is to make sure
that our detection also works for types that can’t be returned from functions,
like array types.

Link to the docs line

点赞