从 int 到 shared_ptr 的隐式转换

2023-11-21

考虑下面的代码:

#include <iostream>
#include <memory>

void f(std::shared_ptr<int> sp) {}

template <typename FuncType, typename PtrType>
auto call_f(FuncType f, PtrType p) -> decltype(f(p))
{
    return f(p);
}

int main()
{
    f(0); // doesn't work for any other int != 0, thanks @Rupesh
    // call_f(f, 0); // error, cannot convert int to shared_ptr
}

在第一行中main(), 整数0被转换为std::shared_ptr<int>和电话f(0)成功,没有任何问题。但是,使用模板来调用函数会使情况有所不同。第二行将不再编译,错误是

error: could not convert 'p' from 'int' to 'std::shared_ptr<int>'

我的问题是:

  1. 为什么第一次调用成功而第二次失败?我在这里缺少什么吗?
  2. 我也不明白如何转换int to std::shared_ptr正在通话中执行f(0),因为它看起来像std::shared_ptr只有显式构造函数。

PS:此示例的一个变体出现在 Scott Meyers 的文章中有效的现代 C++第 8 项,作为保护此类调用的一种方法nullptr.


std::shared_ptr有一个构造函数需要std::nullptr_t, 字面意思0是一个空指针常量,可转换为std::nullptr_t来自 C++ 标准草案部分4.10 [转化指针] (强调我的前进):

空指针常量是整数类型的整型常量表达式 (5.19) 纯右值,其计算结果为零或类型的纯右值 std::nullptr_t。空指针常量可以转换为 指针类型;结果是该类型的空指针值,并且是 与对象指针或函数的所有其他值区分开来 指针类型。这种转换称为空指针转换。 相同类型的两个空指针值比较相等。这 将空指针常量转换为 cv 限定的指针 type 是单个转换,而不是指针的序列 转换之后是资格转换(4.4)。空值 整型指针常量可以转换为纯右值 类型 std::nullptr_t。 [ 注意:结果纯右值不为空 指针值。 ——尾注]

在你的第二种情况下p被推导为类型int虽然其值为零,但不再是空指针常量,因此不适合相同的情况。

作为 T.C.指出措辞已更改为DR 903它需要一个值为零的整数文字,而不是积分常量表达式其计算结果为零:

空指针常量是带值的整数文字 (2.14.2) 零或 std::nullptr_t 类型的纯右值。空指针常量 可以转换为指针类型;结果是空指针 该类型的值并且可以与其他所有值区分开来 对象指针或函数指针类型。

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

从 int 到 shared_ptr 的隐式转换 的相关文章

  • 未提供参数时如何指定 C# System.Commandline 行为?

    在我的控制台应用程序中 当未提供控制台参数时 将执行我指定列表 在本例中为参数 3 的任何处理程序 调用该处理程序时 布尔参数设置为 false 但对我来说 根本不调用它更有意义 如何防止这种情况发生并显示帮助文本 using System
  • 如何将非静态类成员“std::bind”绑定到 Win32 回调函数“WNDPROC”?

    我正在尝试将非静态类成员绑定到标准WNDPROC http msdn microsoft com en us library ms633573 aspx功能 我知道我可以通过将类成员设为静态来简单地做到这一点 但是 作为一名 C 11 ST
  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 如何创建包含 IPv4 地址的文本框? [复制]

    这个问题在这里已经有答案了 如何制作一个这样的文本框 我想所有的用户都见过这个并且知道它的功能 您可以使用带有 Mask 的 MaskedTestBox000 000 000 000 欲了解更多信息 请参阅文档 http msdn micr
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • 是否有实用的理由使用“if (0 == p)”而不是“if (!p)”?

    我倾向于使用逻辑非运算符来编写 if 语句 if p some code 我周围的一些人倾向于使用显式比较 因此代码如下所示 if FOO p some code 其中 FOO 是其中之一false FALSE 0 0 0 NULL etc
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • 在一个平台上,对于所有数据类型,所有数据指针的大小是否相同? [复制]

    这个问题在这里已经有答案了 Are char int long 甚至long long 大小相同 在给定平台上 不能保证它们的大小相同 尽管在我有使用经验的平台上它们通常是相同的 C 2011 在线草稿 http www open std
  • 如何检测表单的任何控件的变化?

    如何检测 C 中表单的任何控件的更改 由于我在一个表单上有许多控件 并且如果表单中的任何控件值发生更改 我需要禁用按钮 我正在寻找一些内置函数 事件处理程序 属性 并且不想为此创建自定义函数 不 我不知道任何时候都会触发任何事件any控制表
  • 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

    我有一个可在 32 位和 64 位处理器上运行的 C 应用程序 我试图枚举给定系统上所有进程的模块 当尝试从 64 位应用程序枚举 32 位进程模块时 这会出现问题 Windows 或 NET 禁止它 我认为如果我可以从应用程序内部重新启动
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • Azure 辅助角色“请求输入之一超出范围”的内部异常。

    我在辅助角色中调用 CloudTableClient CreateTableIfNotExist 方法 但收到一个异常 其中包含 请求输入之一超出范围 的内部异常 我做了一些研究 发现这是由于将表命名为非法表名引起的 但是 我尝试为我的表命
  • 如何禁用 fread() 中的缓冲?

    我正在使用 fread 和 fwrite 读取和写入套接字 我相信这些函数用于缓冲输入和输出 有什么方法可以在仍然使用这些功能的同时禁用缓冲吗 Edit 我正在构建一个远程桌面应用程序 远程客户端似乎 落后于服务器 我不知道可能是什么原因
  • 外键与独立关系 - Entity Framework 5 有改进吗?

    我读过了several http www ladislavmrnka com 2011 05 foreign key vs independent associations in ef 4 文章和问题 https stackoverflow
  • 如何设置 log4net 每天将我的文件记录到不同的文件夹中?

    我想将每天的所有日志保存在名为 YYYYMMdd 的文件夹中 log4net 应该根据系统日期时间处理创建新文件夹 我如何设置它 我想将一天中的所有日志保存到 n 个 1MB 的文件中 我不想重写旧文件 但想真正拥有一天中的所有日志 我该如
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • 使用 .NET Process.Start 运行时挂起进程 - 出了什么问题?

    我在 svn exe 周围编写了一个快速而肮脏的包装器来检索一些内容并对其执行某些操作 但对于某些输入 它偶尔会重复挂起并且无法完成 例如 一个调用是 svn list svn list http myserver 84 svn Docum
  • 当从finally中抛出异常时,Catch块不会被评估

    出现这个问题的原因是之前在 NET 4 0 中运行的代码在 NET 4 5 中因未处理的异常而失败 部分原因是 try finallys 如果您想了解详细信息 请阅读更多内容微软连接 https connect microsoft com
  • 当我使用 OpenSSL1.1.0g 根据固定的 p 和 g 值创建 Diffie Hellman 密钥协议密钥时,应该执行哪些检查?

    您好 我尝试通过这段代码使用修复 p 和 g 参数来制作 Diffie Hellman Keysanswer https stackoverflow com a 54538811 4706711 include

随机推荐

  • 使用“::”代替“module ...”作为 Ruby 命名空间

    在 Ruby 中 写法有区别吗class Foo Bar and module Foo class Bar用于命名空间 如果是这样 那又怎样 如果你使用class Foo Bar 但是Foo模块尚未定义 将会引发异常 而module Foo
  • Solr 通配符搜索

    如果我有一条包含关键字 Chris Muench 的记录 我希望能够匹配 Mue 或 Chr 我怎样才能用 solr 查询来做到这一点 目前我执行以下操作 results solr gt search Apache Solr Service
  • 使用 matplotlib 的内存泄漏

    这并不是一个错误报告 即使这些泄漏可能是由于 mpl 错误造成的 请解释所提出的问题 以寻求解决方法 问题很简单 绘制大量数据 使用plot 或scatter 清除 释放所有内容 垃圾收集 但仍然没有释放几乎所有内存 Line Mem us
  • 如何使用 Moment.js 排除两个日期之间的周末

    我试图在我的 JavaScript 代码中排除周末 我使用 moment js 并且很难为 天 选择正确的变量 到目前为止 我认为我需要通过将工作日变量更改为仅从第 1 天计数到第 5 天来排除第 6 天 星期六 和第 0 天 星期日 但不
  • 无需重新加载页面即可收到通知(例如 facebook 或 google plus 通知)

    将 Facebook 等通知发送到仪表板的理想机制是什么 我认为最好的方法是每 5 秒对 php 页面进行一次 Ajax 调用并检索通知 有没有更好的方法来进行类似的更改 它也应该适用于所有移动浏览器 我按照以下方式做 use post在j
  • 为什么 Graphics.MeasureString() 返回的数字高于预期数字?

    我正在生成收据 并使用 Graphics 对象调用 DrawString 方法来打印所需的文本 graphics DrawString string font brush widthOfPage 2F yPoint stringformat
  • Helm 3:连接到本地 Kubernetes 时出现 x509 错误

    我是一个完美的noob与 K8 一起 我安装了microk8s and Helm using snap在本地进行实验 我想知道我当前的问题是否来自于使用snap 据我了解 其目的是封装 环境 Ubuntu 20 04LTS helm ver
  • 将 ISO 8601 时间格式转换为正常持续时间

    我有一个持续时间字符串 PT1M33S 我想得到以下格式的结果 gt 01 33 谁能告诉我如何使用js或jquery做到这一点 这似乎不是时间格式 只是视频的持续时间 33 Seconds PT1M33S 1 Minute H 小时M 分
  • 如何从字符串中删除换行符?

    我有一个以下格式的字符串 string s This is a Test String n This is a next line t This is a tab n 我想删除所有出现的 n and r从上面的字符串 我努力了string
  • stl::multimap - 如何获取数据组?

    Multimap 本质上具有按键排序的数据组 我想要一种方法来访问这些单独的组并获取它们的聚合值 例如 在一个std multimap lt string int gt 我存储 Group1 1 Group1 2 Group1 3 Grou
  • 类型引用>() { }

    从几天前开始 我开始从事一个网络服务项目 该项目正在使用Jackson编组和解组JSON 对象 所以我的问题是 为什么我总是必须把 当我创建一个实例时TypeReference 我知道构造函数是protected 但为什么是protecte
  • 如果使用 bash 以外的任何东西,我怎样才能拥有 term.el (ansi-term) 跟踪目录

    使用 eshell 或 ansi term 和 bash 时 emacs 会根据您所在的目录更改默认目录变量 所以如果我搬到 home user code project然后使用 ido find file 打开一个文件 它以 CWD 启动
  • 当参数是重载函数时,重载解析如何工作?

    Preamble C 中的重载解析可能是一个过于复杂的过程 理解控制重载解析的所有 C 规则需要付出相当多的脑力劳动 最近我想到参数列表中重载函数名称的存在会增加重载解析的复杂性 由于它恰好是一个广泛使用的案例 所以我发布了一个问题并收到了
  • 如何使用缩进作为 bison 和 flex 的块分隔符

    我很想知道如何在 bison flex 中实现缩进作为块分隔符 就像在 python 中一样 我正在编写自己的编程语言 主要是为了好玩 但我打算将其与游戏引擎一起使用 我将尝试想出一些特殊的东西来最小化样板文件并最大化开发速度 我已经写了一
  • 批量消费消息-RabbitMQ

    我能够使用上面的代码使用多个生产者发送到具有不同路由键的同一交换的多条消息 并且能够将每条消息插入到数据库中 但这会消耗太多资源 因为消息将被一个接一个地插入到数据库中 所以我决定进行批量插入 我发现我可以设置BasicQos 在 Basi
  • 以编程方式渲染 Laravel 7 组件

    我有一个 Laravel 7 组件 如下所示 class Input extends Component public name public title public value public type text Create a new
  • LESS:在 :before 中使用 font-awesome

    我想要一个带有自定义字体 颜色和左侧项目符号的标题的 CSS 选择器 所以我希望我的标题使用我的自定义字体 它是 before伪元素使用 font awesome 所以我想要我的 before拥有 fa类 而整个元素没有这个类 我有这个ht
  • 使用 nginx 和 Gunicorn 运行多个 django 项目

    我在用Ubuntu 18 服务器并使用nginx with gunicorn我跟随数码海洋服务器设置教程 我成功完成了一个项目 但现在我需要在服务器下运行多个项目 这是我的枪鸟设置 command sudo nano etc systemd
  • WCF中的WS是什么意思?

    在wcf中 什么是WS 在WCF中是什么意思 有什么理由将其分组吗 它们是 Web 服务 WS 标准 这篇博文解释一下 WCF 实现的那些 将它们分组是因为它们共同构成了 WS 架构
  • 从 int 到 shared_ptr 的隐式转换

    考虑下面的代码 include