码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • auto{x}与auto(x)---一位中国小伙为cppreference作出的贡献


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

     

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

      

    到底解决了什么问题?

      来看看这个函数。

    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,它随时在发展着,使我们的代码变得更加的简洁和高效。在上面这个例子当中,我们无需进行多余的操作,就能大大地简化代码,或许将来它还能在更多场合发展出优势。

  • 相关阅读:
    新移动时代内容制作呈现与开发利器-Zoomla!逐浪CMS v8.6.2发布
    oracle数据导出exp导入imp
    HarmonyOS开发(三):ArkTS基础
    【DataV/echarts】vue中使用,修改地图和鼠标点击部分的背景色
    基于YOLOv5、YOLOv8的火灾检测(超实用毕业设计项目)
    创作一款表情包生成微信小程序:功能详解与用户体验优化
    回环设备(/dev/loop*)与losetup命令
    HCIP第十五天笔记(企业网的三层架构、VLAN以及VLAN 的配置)
    大会技术“硬核”资讯来啦!点击预约 IoTDB 现场一对一调优咨询服务
    【建议背诵】软考高项考试案例简答题汇总~(8)
  • 原文地址:https://www.cnblogs.com/ChebyshevTST/p/17933558.html
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号