auto{x}与auto(x)---一位中国小伙为cppreference作出的贡献

这篇具有很好参考价值的文章主要介绍了auto{x}与auto(x)---一位中国小伙为cppreference作出的贡献。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  C++作为一门静态类型语言,是需要程序员声明变量类型的。然而来到了C++11,auto的诞生使得变量声明变得及为方便,尤其是对于比较长的模板类型,auto一定程度上为代码编写者减轻了负担。到了C++23,突然来了个新特性:auto{x}/auto(x),这又是个什么东西,它的motivation又是什么?

 

  首先这是一个中国小伙为C++23作出的贡献,他是一位在美国工作的engineering,这是他的主页。

auto{x}与auto(x)---一位中国小伙为cppreference作出的贡献

  

到底解决了什么问题?

  来看看这个函数。

void my_erase(auto& x) {
    std::erase(x, x.front());
}

  假如我们传入一个vector类型,vector初始化为{1, 2, 3, 1, 2, 3},然后通过调用std::erase,按照正常想法,函数执行完毕之后vector应该仅仅删掉大小为1首元素。可是事实却并非如此,通过代码运行会发现容器剩下的元素是{2, 3, 1, 3},这里面究竟发生了什么。

_GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
reference
front() _GLIBCXX_NOEXCEPT
{
 __glibcxx_requires_nonempty();
 return *begin();
}

  通过源码查看,可以发现front()其实是引用类型,而std::erase本身又调用了std::__remove_if,这也不难让人想出解决问题的办法,也就是做一份拷贝。

void my_erase(auto& x) {
    auto tmp = x.front();
    std::erase(x, tmp);
}

  但是既然都来写Cpp了,我们还可以追求点“洁癖”,我们很多时候并不希望有多余的拷贝,这时候右值就派上了用场。

void my_erase(auto& x) {
    using T = std::decay_t<decltype(x.front())>;
    std::erase(x, T{x.front()});
}

  在进行”类型萃取“之后,我们就可以获取到了容器第一个元素的原始类型,或者叫退化类型,即可以去掉cv限定符还有引用的类型(如果传入的是数组,就会退化为指针)。

 

  但是到了C++23,在上面这种语境的情况下,auto{x}/auto(x)便可大展拳脚,没再必要进行”类型萃取“。

void my_erase(auto& x) {
    std::erase(x, auto{x.front()});
}

 

最后

  在现代C++中,auto无疑是宠儿,从C++11到C++14,再到如今的C++23,它随时在发展着,使我们的代码变得更加的简洁和高效。在上面这个例子当中,我们无需进行多余的操作,就能大大地简化代码,或许将来它还能在更多场合发展出优势。文章来源地址https://www.toymoban.com/news/detail-760422.html

到了这里,关于auto{x}与auto(x)---一位中国小伙为cppreference作出的贡献的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ChatGPT提示与技巧分享:如何作出更好的提示2023年8月

      ​对ChatGPT的一些酷炫技巧感兴趣吗?这里提供了一些可以帮助你充分利用ChatGPT,成为AI工具专家的技巧。 毫无疑问,ChatGPT是目前最广泛使用的人工智能工具之一。它不仅毫不留情地取代了一些特定领域常用的软件小工具(如智能对联、经典语录生成器、近义词查询等),而

    2024年02月11日
    浏览(48)
  • 【AI视频教程】只需5步,AI作出鸡你太美视频

    黄昏见证虔诚的信徒 制作视频效果,需要准备下面3个条件: 准备stable diffusion的环境 剪辑一段【鸡你太美】原版视频 stable diffusion安装sd-webui-IS-NET-pro插件 2.1部署stable diffusion环境 部署步骤参考制作ikun图片的文章:【奶奶看了都会】2分钟学会制作最近特火的ikun幻术图 这里还

    2024年02月12日
    浏览(34)
  • vue子组件监听父组件数据变化并作出改变(亲测有效)

    1. 问题 1.1 封装组件时经常会遇到子组件需要根据父组件数据变化并执行对应的操作逻辑 1.2 监听方法中加了deep、immediate 等参数监听数组/对象还是没有生效 1.3 类型table组件需要根据父组件数据变化对表格数据进行更新 1.4 根据数据动态渲染组件需实时监听父组件变化 1.5 使用

    2023年04月08日
    浏览(40)
  • 面了个 Java 实习生,小伙很优秀!

    大家好,我是鱼皮,前几天给自己的公司面试了一位 Java 暑期实习生,候选人目前是大三。 整个过程我都录屏了,并且在征得候选人的同意后,把面试过程分享出来。一方面是希望对其他在学编程找工作的小伙伴有一些启发和参考,另一方面也是希望大家给屑老板一些建议,

    2024年02月05日
    浏览(48)
  • 贡献全球1/5核心突破,腾讯云第六年登上KVM贡献榜

    9 月 12 日,在全球虚拟化顶级技术峰会 KVM Forum 上, 2022 年度全球企业 KVM 开源贡献榜正式发布。腾讯云成为中国唯一连续六年入围的云厂商。 作为云计算的关键底层技术,云厂商需要利用 KVM 对物理机进行虚拟化,提供云端的池化算力。作为 KVM 虚拟化社区最重要、最权威的

    2023年04月18日
    浏览(42)
  • 技术宅小伙:ChatGPT的编程能力到底有多厉害?

        欢迎大家光临技术宅小伙的博客!     有特别多朋友问我     如何给自己制定一份     行之有效的编程学习计划     我最近发现CHATGPT在这方面特别棒     所以今天跟大家简单介绍一下     如何用CHATGPT根据我们自身的特点     帮我们制定一份行之有效的学习规划  

    2023年04月08日
    浏览(32)
  • ai写作怎么用?想知道的小伙伴快看过来

    在新闻和媒体行业中由于ai可以自动分析大量数据,撰写新闻报道、文章和博客等内容。因此多数人通常使用它来进行ai写作,它可以根据指定的主题和要求,产生准确、流畅的文字,帮助我们节省时间和精力。同时,ai写作还可以通过自动化生成内容,满足新闻行业中快速迭

    2024年02月11日
    浏览(62)
  • 这两位学习软件测试的小伙伴,简直太给力了

    大家好,我是小谭。 今天,跟大家聊聊成长营的两个小伙伴,因为她们的打卡学习实在太给力了! 其中一位小伙伴自加入后,就制定了打卡目标,并就着这个目标,开始学习。 我发现她每次打卡都特别认真,这是她复习测试基础的思维脑图: 这是她学习mysql和linux的打卡笔

    2023年04月12日
    浏览(40)
  • 开源贡献难吗?

    本文整理自字节跳动 Flink SQL 技术负责人李本超在 CommunityOverCode Asia 2023 上的 Keynote 演讲,李本超根据自己在开源社区的贡献经历,基于他在贡献开源社区过程中的一些小故事和思考,如何克服困难,在开源社区取得突破,并且在工作和开源贡献之间取得平衡的相关内容,跟大

    2024年02月08日
    浏览(38)
  • 开源项目贡献者指南

    非常欢迎参与项目贡献,我们致力于维护一个互相帮助,共同成长社区。 在Fastbee 社区,贡献方式有很多: 💻代码:可以帮助社区完成一些任务、编写新的feature或者是修复一些bug; ⚠️测试:可以来参与测试代码的编写,包括了单元测试、集成测试、e2e测试; ✅编译:构建

    2024年01月25日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包