gpt4 book ai didi

c++ - 关于 std::add_pointer 实现的问题

转载 作者:太空狗 更新时间:2023-10-29 21:09:41 24 4
gpt4 key购买 nike

来自 std::add_pointer

Possible implementation

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)) {};

上述(可能的)实现的描述如下:

If T is a reference type, then provides the member typedef type which is a pointer to the referred type.

Otherwise, if T names an object type, a function type that is not cv- or ref-qualified, or a (possibly cv-qualified) void type, provides the member typedef type which is the type T*.

Otherwise (if T is a cv- or ref-qualified function type), provides the member typedef type which is the type T.

在上面的(可能的)实现代码中,显然是 struct add_pointer派生自 detail::try_add_pointer<T>(0) 返回的类型.

detail::try_add_pointer<T> 的重载返回的类型派生背后的逻辑是什么?服用int参数,解析成员 typedef type上述三种可能性之一?具体来说,这如何解决 T 的可能性?是 cv-ref-限定函数类型?

最佳答案

关键在于了解如何为 detail::try_add_pointer<T>(0) 进行重载解析作品。替换 T进入detail::try_add_pointer旨在产生一个重载集,该重载集将始终包含至少一个成员(变量参数重载)。

重载是否占用int在重载解析期间被丢弃 ( SFINAE ) 由替换 T 的成功决定进入typename std::remove_reference<T>::type* .当替换成功时,重载存在,并且在 0 的重载解析中是更好的匹配(与任何其他转换序列相比,省略号是最差的可能匹配)。无论哪种方式,无论在重载决议中选择哪个重载,decltype(detail::try_add_pointer<T>(0))将解析为具有嵌套 ::type 的内容成员(member)。

那么让我们逐个分析:

  1. “如果 T 是引用类型”- 让我们标记它 T = T2& .那么std::remove_reference<T>::typeT2 .我们可以形成引用的类型也是我们可以形成指针的类型。所以std::remove_reference<T>::type*格式正确(它是 T2* ),并且存在第一个重载。它在过载解决方案中被拾取。嵌套::type它的返回类型是 T2* .

  2. “否则,如果 T 命名一个对象类型、一个非 cv 或 ref 限定的函数类型,或者一个(可能是 cv 限定的)void 类型”- 在这种情况下 std::remove_reference<T>::type就是T .我们可以形成一个指向前面列表中任何类型的指针,所以 std::remove_reference<T>::type*再次形成良好(它是 T* )。第一个重载再次存在并在重载决议中被拾取。嵌套::type它的返回类型是 T* .

  3. “否则(如果 T 是 cv 或 ref 限定的函数类型)”- 有趣的一点。这谈到像 void (int) const& 这样的类型.又来了std::remove_reference<T>::typeT .但是我们不允许形成指向T的指针。 ,基本语言禁止它。因此std::remove_reference<T>::type*格式错误,对于此重载决议,第一个重载将被忽略。只剩下第二个重载,它是由重载决议拾取的。嵌套::type它的返回类型是 T .

关于c++ - 关于 std::add_pointer 实现的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57506069/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com