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

auto{x}与auto(x)---一位中国小伙为cppreference作出的贡献的更多相关文章

  1. linux下出现+ ls --color=auto -l --color=auto...++ echo -ne '\033]0;root@imon-2:~'等

    [root@imon-2 ~]# cd /root/ + cd /root/ ++ echo -ne '\033]0;root@imon-2:~' [root@imon-2 ~]# ll + ls - ...

  2. c++中的auto、const auto&

    先介绍一下auto.const: 在块作用域.命名作用域.循环初始化语句等等  中声明变量时,关键词auto用作类型指定符. const:修饰符 接下来我们细细分析一下: (1)auto auto即 ...

  3. Auto Layout Guide----(二)-----Auto Layout Without Constraints

    Auto Layout Without Constraints 没有约束的自动布局 Stack views provide an easy way to leverage the power of A ...

  4. ExtJS 布局-Auto布局(Auto Layout)

    更新记录 2022年5月30日 开启本篇 1.说明 auto布局是大部分容器默认的布局类型. auto布局通常是从上到下进行堆叠,auto布局不会设置子组件的宽度,默认与容器一样的宽度. 类似于HTM ...

  5. 【Mood-14】龙虎榜 活跃在github中的1000位中国开发者

    Last cache created on 2015-01-07 by Github API v3. ♥ made by hzlzh just for fun. Rank Gravatar usern ...

  6. Flutter 中文文档网站 flutter.cn 正式发布!

    在通常的对 Flutter 介绍中,最耳熟能详的是下面四个特点: 精美 (Beautiful):充分的赋予和发挥设计师的创造力和想象力,让你真正掌控屏幕上的每一个像素. ** 极速 (Fast)**: ...

  7. item 5: 比起显式的类型声明,更偏爱auto

    本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 啊,简单愉快的代码: int x; 等等,讨厌!我忘了初始化x,所 ...

  8. auto和register关键字

    关键字概述 很多朋友看到这儿可能会有疑问,往往其它讲C语言的书籍都是从HelloWorld,数据类型开始C语言学习的,为什么我们要从C语言的关键字开始呢?关于这点,我有两点需要说明: 本章节面向的读者 ...

  9. auto类型推导

    引言 auto : 类型推导. 在使用c++的时候会经常使用, 就像在考虑STL时迭代器类型, 写模板的时候使用auto能少写代码, 也能帮助我们避免一些隐患的细节. auto初始化 使用auto型别 ...

  10. 第3课 auto类型推导(2)

    第3课 auto类型推导(2) 一.使用auto的优势 (一)避免使用未初始化变量 (二)可简化变量/对象类型的声明 (三) 在某些场合无法判断出类型时,可用auto自动推导(如lambda表达式) ...

随机推荐

  1. defined('BASEPATH') OR exit('No direct script access allowed'); 的作用

    起到保护.php文件的作用, 如果直接访问此php文件会得到"不允许直接访问脚本"的错误提示 如果你是用ci框架或者其他的什么, 就建议加上, 如果你怕别人恶意攻击你的话

  2. excel的烦恼

    Smiling & Weeping ---- 他未对我好半分,偏巧这感情疯长似野草 题目链接:https://www.matiji.net 思路:与新三进制2思路相似,转化为纯26进制,然后往 ...

  3. Webpack性能优化 SplitChunksPlugin的使用详解

    使用前景 在vue.react等使用webpack为项目打包工具的前端项目,在开发过程中,随着项目功能的逐渐增加,项目整体体积的不断增加,打包的时长和打包后部署的项目体积也在不停的增长,这样可能会导致 ...

  4. 部分网页中仅供浏览的pdf文件下载方法

    现在越来越多的网站提供的PDF资料只能在线浏览,不提供下载功能,实际上仅仅是通过网页PDF浏览插件来访问文件资源,如果能够获取到该文件的访问地址,就可以访问下载. 以Firefox浏览器访问某大学网站 ...

  5. apollo多环境部署

    一.环境准备 jdk : 1.8+         mysql  5.6.5+ 二.安装包下载 https://github.com/ctripcorp/apollo/releases 下载如下三个压 ...

  6. 5分钟入门 next13

    上半年vercel 推出了nextjs13 这个大版本,刚好最近有个c端的项目,所以就用了这个框架来写,技术体系基本也是文档提到的 tailwindcss + ts + swr + ssr ,总的来开 ...

  7. Sentinel系列之SlotChain、NodeSelectorSlot、ClusterBuilderSlot分析

    本文基于Sentinel 1.8.6版本分析 1. SlotChain 我们从入口com.alibaba.csp.sentinel.SphU#entry(java.lang.String) 开始分析. ...

  8. 2023-10-07:用go语言,给定n个二维坐标,表示在二维平面的n个点, 坐标为double类型,精度最多小数点后两位, 希望在二维平面上画一个圆,圈住其中的k个点,其他的n-k个点都要在圆外。

    2023-10-07:用go语言,给定n个二维坐标,表示在二维平面的n个点, 坐标为double类型,精度最多小数点后两位, 希望在二维平面上画一个圆,圈住其中的k个点,其他的n-k个点都要在圆外. ...

  9. 【算法】游戏中的学习,使用c#面向对象特性控制游戏角色移动

    最近,小悦的生活像是一首繁忙的交响曲,每天忙得团团转,虽然她的日程安排得满满当当,但她并未感到充实.相反,她很少有时间陪伴家人,这让她感到有些遗憾.在周五的午后,小悦的哥哥突然打来电话,他的声音里充满 ...

  10. NPOI在EXCEL中插入图片和超链接

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...