通过 std::Optional 标准化,我们可以停止在新代码中使用 nullptr 并弃用它吗? [关闭]

2023-11-30

从远古时代开始,当向函数传递指针或从函数传递指针时,我们倾向于对空指针进行特殊处理:

 p = get_pointer_to_the_foo(args);
 if (p == nullptr) { /* foo is inaccessible, do one thing */ }
 else { /* we can access foo, do something else */ }

这是从 C 继承的。现在,我们偶尔会对其他类型做同样的事情,例如使用有符号类型来表示有效的非负值(例如 -1)或指示错误。

随着 的开始,后一种模式现在将最终被弃用。std::optional: std::optional<unsigned>或者是nullopt或非负值。但是 - 指针呢?毕竟,nullptr只是无数无效指针值之一。因此,当编写新代码时(当所有代码都是 C++17 时)——我们是否应该基本上忘记它,并传递其中之一std::optional<foo_t*>'s 或假定非空foo_t *'s?


指针已经嵌入了可选语义。所以std::optional<T*>至少可以说这是多余的,并且该功能的引入不会对原始指针产生太大影响。

这也适用于std::unique_ptr, std::shared_ptr and std::weak_ptr所有这些也可以nullptr.

就像任何新功能一样,我们必须思考什么是实用的,什么是我们本能的在任何可行的地方使用它的冲动。

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

通过 std::Optional 标准化,我们可以停止在新代码中使用 nullptr 并弃用它吗? [关闭] 的相关文章

随机推荐

  • 如何在Azure Blob上实现快速搜索?

    我已完成编写将文件 文本文件 上传到 azure blob 存储的代码 现在我想提供基于文本文件内容的搜索 对于前 如果我搜索 Hello 那么包含 Hello 单词的文件名应该出现在搜索结果中 这是我要搜索的代码 class BlobSe
  • Javascript 到 csv 导出编码问题

    我需要将 javascript 数组导出到 Excel 文件并下载它 我正在这段代码中执行此操作 data 是一个 JavaScript 对象数组 var csvContent data text csv charset utf 8 dat
  • 避免在jetpack compose中的嵌套列中进行重组

    我正在 jetpack compose 中的嵌套列上工作 我有一个列表 其中包含来自服务器的大量数据 我在布局检查器中进行了检查 我发现每当我的项目添加到列表中时 它都会重新组合并增加计数 所以我的疑问是 如果我在列表中一一添加 100 个
  • 在 C# 中将值从一种形式传递到另一种形式

    我必须通过id从 C 中的一种形式到另一种形式 我无法做到这一点 C 代码是 private void btnedit Click object sender EventArgs e foreach DataGridViewRow a in
  • 通过反射确定派生类

    我想处理从类 A 派生的类的方法 类 A 和派生类驻留在不同的程序集中 我使用反射从派生程序集中获取所有 System Type 并迭代它们的方法 Assembly A class Template Assembly B class X A
  • 无法使用 SSH 隧道将 MongoDB Compass 连接到 AWS DocumentDB

    我是 mongoDB 新手 试图为我的新项目设置工具 我的大部分基础设施都在 AWS 上运行 因此我更喜欢使用 AWS documentDB 我设法通过 mongo 客户端或 NodeJS 应用程序从 EC2 连接到 documentDB
  • HTML 文档的 head 元素内可以有 div 标签吗?

    只是想知道是否可以在 head 元素内添加 div 标签 No div 不是位于其中的有效标签标签 因为标签仅适用于元数据 例如标题和页面描述 脚本 样式和其他不打算显示的内容 虽然将其放入有效 这样做很糟糕 你不应该把它放在那里 规范说这
  • Python:从 urllib2.urlopen 调用获取 HTTP 标头?

    Does urllib2当 a 时获取整个页面urlopen已拨打电话 我只想读取 HTTP 响应标头而不获取页面 看起来像urllib2打开 HTTP 连接 然后获取实际的 HTML 页面 或者它只是开始缓冲页面urlopen call
  • Haskell“没有实例”错误

    我正在尝试编写一个函数来检查数字是否为素数 我写了这个 primeCheck Int gt Int gt Bool primeCheck n i n 2 True i 1 True n mod i 0 False otherwise pri
  • Google 图表 - 单击图例键时隐藏线条

    我希望在单击图例中的相关键时能够显示 隐藏折线图上的线条 这可能吗 要隐藏 GWT 可视化折线图上的显示线 请按照下列步骤操作 1 基于现有的DataTable对象创建DataView对象 DataTable dataTable DataT
  • 使用 matplotlib 具有多种颜色的颜色轴脊柱

    是否可以使用 python 中的 matplotlib 对轴脊柱进行多种颜色着色 所需的输出风格 您可以使用LineCollection创建一个五彩线 然后 您可以使用 x 轴变换将其固定在 x 轴上 而与 y 限制无关 设置实际脊柱不可见
  • 有没有办法在 Rust 中创建指向方法的函数指针?

    例如 struct Foo impl Foo fn bar self fn baz self fn main let foo Foo let callback foo bar error E0615 attempted to take va
  • Guice:一个“Provider”用于多种实现

    我有一个包含 20 个左右带注释的实现的接口 如果我在编译时知道需要哪个 我可以注入正确的 但现在我需要根据运行时参数动态注入一个 据我了解文档 我将不得不使用 20 左右Provider
  • R 中的递归均值与 Rcpp

    我正在尝试使用简单的递归实现来计算变量的平均值 m lt 0 initialize mean for irep in 0 999 new data point new data lt rnorm 1 2 1 recursive formul
  • 日期减去 1 年?

    我有一个以下格式的日期 2009 01 01 如何返回 1 年前的相同日期 您可以使用strtotime date strtotime 2010 01 01 1 year The strtotime函数返回一个unix时间戳 以获取可以使用
  • React hooks 使用相同的原始值调用 setState 仍然会导致重新渲染

    我发现当我定义一个值为 1 的状态时 并在每次单击按钮时将状态设置为值 2 the 前两个次数会导致重新渲染 重现演示 https codesandbox io s sweet brattain ys11d 代码 使用react 17而不使
  • Grunt - 如何使用 grunt 缓存清理更新 js 文件中的 html 文件引用?

    在我的 js 文件中 我引用了 HTML 文件 例如 window location 我希望 grunt 缓存清理更新该引用并添加哈希数据 因此加载的页面是正确的页面 即使用正确版本文件的页面 例如 window location mywe
  • shoulda-matchers 的 ActiveRecord 匹配器是否违反了“测试行为而非实现”规则?

    例如 如果我正在使用should validate presence of在我的规范中 这只是测试我是否拥有validate presence of我的模型中的一段代码 这就是测试实现 更重要的是 这个规范对于测试真正的问题是不是完全没有用
  • GetListItems Web 服务忽略我的查询过滤器

    下面的代码看似执行 Web 服务并返回值 但忽略了 where 子句 从而返回列表中的所有项目 这是我提出的问题的最简单形式 TestQuery 列表是一个简单的自定义列表 没有用户定义的字段 谁能明白为什么过滤器不起作用
  • 通过 std::Optional 标准化,我们可以停止在新代码中使用 nullptr 并弃用它吗? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 从远古时代开始 当向函数传递指针或从函数传递指针时 我们倾向于对空指针进行特殊处理 p get pointer to the foo args if p nullptr foo is in