为什么在"std::add_pointer_t"中需要SFINAE



我最近一直在破解标准库,因为我需要为一个没有stdlib实现的系统实现它的一个子集(主要是模板(。

我遇到了这个";"可能的实现";,在cppreference中:

namespace detail {

template <class T>
struct type_identity { using type = T; }; // or use std::type_identity (since C++20)

template <class T>
auto try_add_pointer(int) -> type_identity<typename std::remove_reference<T>::type*>;
template <class T>
auto try_add_pointer(...) -> type_identity<T>;

} // namespace detail

template <class T>
struct add_pointer : decltype(detail::try_add_pointer<T>(0)) {};

我一直在想你为什么需要SFINAE在这里。这不是:吗

template< class T >
struct add_pointer {
typedef typename std::remove_reference<T>::type* type;
};

够了吗?哪个实例化采用try_add_pointer的第二种情况?我试着想了想,但想不出任何这样的案例。

我不确定这是否是唯一的坏情况,但由于所谓的"恶劣的函数类型":

add_pointer<void() const>::type // hard error instead of void() const

相关内容

  • 没有找到相关文章

最新更新