关于std::add_pointer的实现的一个问题

2024-01-11

From std::add_pointer https://en.cppreference.com/w/cpp/types/add_pointer

可能的实施

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

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

如果 T 是引用类型,则提供成员 typedef 类型,其中 是指向所引用类型的指针。

否则,如果 T 命名一个对象类型,则该函数类型不是 cv- 或 ref 限定的,或(可能是 cv 限定的)void 类型,提供 成员 typedef type 是 T* 类型。

否则(如果 T 是 cv 或 ref 限定的函数类型),则提供 成员 typedef type 是类型 T。

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

从重载返回的类型派生背后的逻辑是什么detail::try_add_pointer<T> taking int争论,解决成员typedef type上述三种可能性之一?具体来说,如果T is a cv- or ref-合格的函数类型?


关键是理解如何重载解析detail::try_add_pointer<T>(0)作品。替代T into detail::try_add_pointer旨在生成一个始终包含至少一个成员的重载集(变量参数重载)。

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

那么我们就来具体案例分析一下:

  1. “如果 T 是引用类型” - 让我们标记一下T = T2&. Then std::remove_reference<T>::type is T2。我们可以形成引用的类型也是我们可以形成指针的类型。所以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>::type is T。但我们不允许形成一个指向T,基本语言禁止它。所以std::remove_reference<T>::type*格式不正确,对于此重载决策,第一个重载将被忽略。只剩下第二个重载,这是重载解析所拾取的重载。嵌套的::type其返回类型是T.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于std::add_pointer的实现的一个问题 的相关文章

  • 如何检查图像对象与资源中的图像对象是否相同?

    所以我试图创建一个简单的程序 只需在单击图片框中更改图片即可 我目前只使用两张图片 所以我的图片框单击事件函数的代码 看起来像这样 private void pictureBox1 Click object sender EventArgs
  • 如何使 Windows 窗体的关闭按钮不关闭窗体但使其不可见?

    该表单有一个 NotifyIcon 对象 当用户单击 关闭 按钮时 我希望表单不关闭而是变得不可见 然后 如果用户想再次查看该表单 可以双击系统托盘中的图标 如果用户想关闭表单 可以右键单击该图标并选择 关闭 有人可以告诉我如何使关闭按钮不
  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • C# 和 Javascript SHA256 哈希的代码示例

    我有一个在服务器端运行的 C 算法 它对 Base64 编码的字符串进行哈希处理 byte salt Convert FromBase64String serverSalt Step 1 SHA256Managed sha256 new S
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 将数组向左或向右旋转一定数量的位置,复杂度为 o(n)

    我想编写一个程序 根据用户的输入 正 gt 负 include
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • C++ 子字符串返回错误结果

    我有这个字符串 std string date 20121020 我正在做 std cout lt lt Date lt lt date lt lt n std cout lt lt Year lt lt date substr 0 4 l
  • 如果使用 SingleOrDefault() 并在数字列表中搜索不在列表中的数字,如何返回 null?

    使用查询正数列表时SingleOrDefault 当在列表中找不到数字时 如何返回 null 或像 1 这样的自定义值 而不是类型的默认值 在本例中为 0 你可以使用 var first theIntegers Cast
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • clang 实例化后静态成员初始化

    这样的代码可以用 GCC 编译 但 clang 3 5 失败 include
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • 如何让Gtk+窗口背景透明?

    我想让 Gtk 窗口的背景透明 以便只有窗口中的小部件可见 我找到了一些教程 http mikehearn wordpress com 2006 03 26 gtk windows with alpha channels https web
  • WCF:将随机数添加到 UsernameToken

    我正在尝试连接到用 Java 编写的 Web 服务 但有些东西我无法弄清楚 使用 WCF 和 customBinding 几乎一切似乎都很好 除了 SOAP 消息的一部分 因为它缺少 Nonce 和 Created 部分节点 显然我错过了一
  • 为什么 C# Math.Ceiling 向下舍入?

    我今天过得很艰难 但有些事情不太对劲 在我的 C 代码中 我有这样的内容 Math Ceiling decimal this TotalRecordCount this PageSize Where int TotalRecordCount
  • 如何使用 std::string 将所有出现的一个字符替换为两个字符?

    有没有一种简单的方法来替换所有出现的 in a std string with 转义 a 中的所有斜杠std string 完成此操作的最简单方法可能是boost字符串算法库 http www boost org doc libs 1 46
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我

随机推荐