首页 > 编程语言 >第3章_auto占位符(C++11~C++17)

第3章_auto占位符(C++11~C++17)

时间:2024-09-01 23:49:40浏览次数:12  
标签:11 17 推导 auto C++ 类型 lambda

第3章 auto占位符(C++11~C++17)

3.1 重新定义的auto关键字

在C++11中静态成员变量是可以用auto声明并且初始化的,不过前提是auto必须使用const限定符。

static const auto x = 5;

遗憾的是,const限定符会导致x常量化,显然这不是我们想要的结果。在C++17标准中,对于静态成员变量,auto可以在没有const的情况下使用。

C++20之前,无法在函数形参列表中使用auto声明形参(注意,在C++14中,auto可以为lambda表达式声明形参)

void fun(auto a)	// C++20之前编译错误
{
    qDebug() << N;
}
int main()
{
    int x = 1;
    fun(x);
}

3.2 推导规则

1.如果auto声明的变量是按值初始化,则推导出的类型会忽略cv限定符;
2.使用auto声明变量初始化时,目标对象如果是引用,则引用属性会被忽略;
3.使用auto和万能引用声明变量时(见第6章),对于左值会将auto推导为引用类型;
4.使用auto声明变量,如果目标对象是一个数组或者函数,则auto会被推导为对应的指针类型;
5.当auto关键字与列表初始化组合时,这里的规则有新老两个版本,这里只介绍新规则(C++17标准)。
(1)直接使用列表初始化,列表中必须为单元素,否则无法编译,auto类型被推导为单元素的类型。
(2)用等号加列表初始化,列表中可以包含单个或者多个元素,auto类型被推导为std::initializer_list,其中T是元素类型。请注意,在列表中包含多个元素的时候,元素的类型必须相同,否则编译器会报错

3.3 什么时候使用auto

简单归纳auto的使用规则。
1.当一眼就能看出声明变量的初始化类型的时候可以使用auto
2.对于复杂的类型,例如lambda表达式、std::bind等直接使用auto

3.4 返回类型推导【C++14】

C++14标准支持对返回类型声明为auto的推导,例如:

 auto l = [](auto a1, auto a2) { return a1 + a2; };

3.5 lambda表达式中使用auto类型推导

在C++14标准中我们还可以把auto写到lambda表达式的形参中,这样就得到了一个泛型的lambda表达式

起初在后置返回类型中使用auto是不允许的,但是后来人们发现,这是唯一让lambda表达式通过推导返回引用类型的方法了

传入参数类型(auto& i),后置返回类型(-> auto&),接收结果的变量(auto& j)必须都是&,才能正确的返回引用。

auto lamda1 = [](auto& i) -> auto& { return i;};
auto& j = lamda1(s);

3.6 非类型模板形参占位符【C++17】

C++17标准对auto关键字又一次进行了扩展,使它可以作为非类型模板形参的占位符。

template<auto N>
void f()
{
    qDebug() << N;
}
int main()
{
  	f<5>();
    f<'c'>();
    f<5.6>();	// 书上说编译错误  但是在Qt6.7 + MSVC2019 + C++17下通过了编译
}

3.7 结构化绑定【C++17】

对结构体的结构化绑定(structured bindings),这是C++17标准中引入的特性。

将对象的成员绑定到变量上,从而可以更方便地访问这些成员。

struct A {
    int a;
    double b;
};

int main() {
    auto a = A{ .a = 1, .b = 2.0 };
    auto [x, y] = a;
    qDebug() << x << " " << y; // 输出: 1 2

    return 0;
}

标签:11,17,推导,auto,C++,类型,lambda
From: https://www.cnblogs.com/Danieeel959/p/18391949

相关文章

  • 第5章 函数返回类型后置(C++11)
    第5章函数返回类型后置(C++11)5.1使用函数返回类型后置声明函数语法:auto是一个占位符,int才是真正的返回类型autofoo()->int{return42;}返回一个函数指针类型,返回类型后置可能会是一个不错的选择intbar_impl(intx){returnx;}typedefint(*bar)(int);bar......
  • 第4章 decltype说明符(C++11~C++17)
    第4章decltype说明符(C++11~C++17)4.1回顾typeof和typeid(1)在C++11标准发布以前,GCC的扩展提供了一个名为typeof的运算符。通过该运算符可以获取操作数的具体类型。typeof是GCC所提供,并非C++标准。inta=9;typeof(a)b=5;(2)C++标准还提供了一个typeid运算符来获取与目标操......
  • Openshift 3.11单机版 离线安装
    Openshift3.11单机版离线安装‍前置条件虚拟机:建议系统内存>=6G,CPU>=4。镜像仓库:在虚拟机上能够访问到该镜像仓库,如果没有,推荐使用harbor自建。docker:虚拟机上需要安装docker,这里使用的是18.09版本。离线安装可参考docker离线安装或自行下载rpm包安装。‍安装步骤......
  • springboot原创歌曲分享平台(11066)
     有需要的同学,源代码和配套文档领取,加文章最下方的名片哦一、项目演示项目演示视频二、资料介绍完整源代码(前后端源代码+SQL脚本)配套文档(LW+PPT+开题报告)远程调试控屏包运行三、技术介绍Java语言SSM框架SpringBoot框架Vue框架JSP页面Mysql数据库IDEA/Eclipse开发四、项......
  • springboot招生管理系统(11071)
     有需要的同学,源代码和配套文档领取,加文章最下方的名片哦一、项目演示项目演示视频二、资料介绍完整源代码(前后端源代码+SQL脚本)配套文档(LW+PPT+开题报告)远程调试控屏包运行三、技术介绍Java语言SSM框架SpringBoot框架Vue框架JSP页面Mysql数据库IDEA/Eclipse开发四、项......
  • 中国各地区数字经济发展对环境污染的影响数据(2011-2021年)
    关于中国各地区数字经济发展对环境污染的影响数据(2011-2021年),可以从以下几个方面获取相关信息:数字经济水平:可以通过熵值法衡量的数字经济水平指标来评估各地区的数字经济发展情况。环境污染物排放量:包括PM2.5均值、工业烟粉尘排放量、工业二氧化硫排放量和工业废水排放量等......
  • 深入理解C++中的同步并发操作(c++ concurrency in action 第四章总结)
    深入理解C++中的同步并发操作(c++concurrencyinaction第四章总结)第四章详细介绍了C++中的各种并发工具,包括条件变量、std::future和std::async、带超时的wait、std::packaged_task和std::promise,以及如何使用这些工具来简化代码。本总结将依次介绍这些工具的用法......
  • 深入理解C++中的const:函数参数与成员函数的最佳实践
    const关键字在C++中有多种用途,它的主要作用是定义不可修改的变量或数据,使得代码更加安全和清晰。具体使用场景包括:定义常量变量:使用const定义的变量在初始化后不能被修改。这样可以防止代码中对该变量的意外修改。constintmax_value=100;max_value=200;//错误:尝试......
  • 深度解析:引用 vs 指针,C++程序员必须掌握的核心概念
    引用(Reference)和指针(Pointer)都是C++中非常重要的概念,它们都用于间接访问变量或对象,但在使用方式、语法、内存管理等方面存在显著区别。下面详细解释什么是引用,并展开讨论它与指针的区别。一、什么是引用?引用(Reference)是C++中的一种变量类型,它是已存在变量的一个别名。引用本......
  • C++菜鸟教程 - 从入门到精通 第一节
    一.C++简介C++是一种编程语言,它是由BjarneStroustrup于1979年在贝尔实验室开始设计开发的。C++进一步扩充和完善了C语言,是一种面向对象的程序设计语言。C++可运行于多种平台上,如Windows、MAC操作系统以及 UNIX的各种版本。C++是一种静态类型的、编译式的、......