8、constexpr if、inline、类模版参数推导、lambda的this捕获、初始化列表、namespace---c++17

一、constexpr if:编译时条件分支

  • 作用:在模板编程中,根据条件在编译时选择不同的代码路径,无需特化版本或复杂SFINAE技巧[替代SFINAE]。[SFINAE将在模版元编程再讲。下个月了。]

注意:默认使用了隐式inline

  • 基本语法
if constexpr (condition) {// 如果 condition 为 true,编译这部分
} else {// 如果 condition 为 false,编译这部分(可选)
}
  • condition 必须是编译时可求值的常量表达式(如 constexpr 变量、模板参数、sizeof 等)
  • 关键区别:与普通 if 不同,if constexpr 在编译时直接丢弃未选择的分支,不会检查语法有效性。

在这里插入图片描述

二、inline变量:头文件中的全局/静态变量定义

  • 作用:允许在头文件定义全局变量或类的静态成员变量,避免多次定义的链接错误。
  • inline可以减少函数调用开销,提高性能。

注意:在类定义内部直接实现的成员函数(如头文件中的类方法)默认是 inline 的,无需显式声明。

  • c++17前,只能在头文件中声明后,cpp文件中使用。
    • extern可以用来告知已经定义过这个变量了。推荐这篇文章
  • 例子(c++17前的static 变量,需要再类的外面定义,类里面声明)
// MyClass.h
class MyClass {
public:static int sharedValue; // 头文件中声明
};// MyClass.cpp
int MyClass::sharedValue = 10; // 必须在一个.cpp文件中定义
  • 而c++17后,就只需要在static变量前面加inline,就可以定义了。
// MyClass.h (C++17后)
class MyClass {
public:inline static int sharedValue = 10; // 直接初始化,无需外部定义
};// 使用:多个.cpp文件可以安全包含此头文件

三、类模版参数推导

  • 作用:编译器根据构造函数参数自动推导类模板类型,简化代码。
#include <vector>
#include <tuple>// 标准库的CTAD:无需显式模板参数
std::pair p(1, 3.14);        // 推导为 std::pair<int, double>
std::vector v{1, 2, 3};      // 推导为 std::vector<int>// 自定义类
template <typename T, typename U>
struct MyPair {T first;U second;MyPair(T f, U s) : first(f), second(s) {}
};// 使用CTAD
MyPair mp(5, "hello");  // 推导为 MyPair<int, const char*>// 若构造函数无法推断类型,可添加推导指引:
template <typename T>
MyPair(T, T) -> MyPair<T, T>; // 处理MyPair(2,3)到MyPair<int, int>的推导

补充:auto占位的非类型模版形参

  • auto占位的非类型模版形参
template<auto T>
void func1(){cout<<T<<endl;
}
int main(){func1<100>();//100return 0;
}

四、lambda的this捕获[*this]

  • 作用:按值捕获当前对象的副本,避免捕获this指针可能导致的对象销毁后的悬垂引用

悬垂引用是指引用了一个已经被销毁或无效的内存的引用变量

// C++17后:按值捕获对象副本,安全
#include <iostream>class Worker {
public:int data = 42;void start() {// C++17前:按引用捕获this,危险!(若对象销毁后lambda还在运行)auto lambda_old = [this]() { std::cout << data << "\n"; // 可能的悬垂引用};// C++17后:按值捕获对象副本,安全auto lambda_new = [*this]() mutable { data++; // 操作的是副本的datastd::cout << data << "\n"; // 输出43};}
};

五、初始化列表

1、c++11

  • 统一初始化语法:允许用花括号 {} 初始化几乎所有类型的对象,避免旧的 () 和 {} 混乱。
// 常见初始化方式
int arr[] = {1, 2, 3};
std::vector<int> vec = {4, 5, 6};// 聚合类(没有自定义构造函数、无私有成员等)
struct Point { int x; int y; };
Point p = {10, 20}; // C++11允许聚合初始化// 构造函数使用初始化列表
class Widget {
public:Widget(std::initializer_list<int> list) { /*...*/ }
};
Widget w{1, 2, 3}; // 调用初始化列表构造函数
  • 注意特性:
    • 禁止窄化转换(如 double → int):int x{3.14}; 会报错。
    • 解决构造函数歧义:优先匹配 std::initializer_list 构造函数。
    • 支持聚合类型初始化:简化结构体和数组的初始化。

2、c++17初始化列表增强

2.1、类模板参数推导(CTAD)支持初始化列表

// C++17前:需显式指定模板参数
std::vector<int> v1 = {1, 2, 3};// C++17允许推导
std::vector v2{1, 2, 3}; // 推导为 vector<int>
std::pair p{42, "hello"}; // 推导为 pair<int, const char*>

2.1、聚合初始化扩展

  • 允许继承的聚合初始化:基类可以是聚合类型。
struct Base { int a; };
struct Derived : Base { int b; };
Derived d{{1}, 2}; // C++17:基类成员先初始化

注意:基类成员先初始化

2.2、允许直接列表初始化枚举

enum class Color { Red, Green, Blue };
Color c{1}; // C++17允许,对应Color::Green

在这里插入图片描述

六、namespace的嵌套

  • 在c++17前,声明namespace嵌套,是一层一层的命令。
//C++17之前
namespace A {namespace B {namespace C {void func1() {}} //namespace C} //namespace B
} //namespace A
  • c++17是可以使用作用域限定符方式简化。
//C++17
namespace A::B::C {void func1() {}
} //namespace A::B::C

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/78139.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java设计模式及实践学习-第4章节-结构型模式】

第4章节-结构型模式 笔记记录 1. 适配器模式2. 代理模式3. 装饰器模式4. 桥接模式5. 组合模式6. 外观模式7. 享元模式8. 总结 1. 适配器模式 2. 代理模式 3. 装饰器模式 4. 桥接模式 5. 组合模式 6. 外观模式 7. 享元模式 Java语言中的String字符串就使用了享元模式&…

unity基础自学2.3:移动和抓握物品

文章目录 前言&#xff1a;1、基础配置①XR Interaction Toolkit②创建一个XR场景③示例文件实现④ 一键配置&#xff08;PICO Building Blocks&#xff09; 2、射线移动物品和抓握物品方法一&#xff1a;Grab Interactable方法二&#xff1a;prefab 3、Box Collider的作用与使…

pytest基础-new

规范 1、首先创建 py 文件命名以 test_ 开始或者以 _test 结尾 2、若是新建类&#xff0c;测试类需要以 Test_开头 3、测试用例&#xff08;方法&#xff09;需要以 test_开头 assert 断言 assert xx&#xff1a;判断 xx 为真 assert not xx&#xff1a;判断 xx 不为真 asse…

【华为OD机试真题】232、统计射击比赛成绩 | 机试真题+思路参考+代码分析(C++)

题目描述 给定一个射击比赛成绩单,包含多个选手若干次射击的成绩分数,请对每个选手按其最高3个分数之和进行降序排名,输出降序排 名后的选手ID序列 条件如下: 1.一个选手可以有多个射击成绩的分数,且次序不固定 2.如果一个选手成绩少于3个,则认为选手的所有成绩无效,排名…

⭐Unity 开发 | 如何通过 NTP 网络时间实现精准的跨平台时间同步【附完整源码 + UI 模块 + 偏差分析】

&#x1f3ae; 项目实战 | 实现一套精确、可视化的游戏时间同步机制&#xff0c;让你的多人在线游戏摆脱“时间不一致”噩梦&#xff01; 效果如图&#xff1a; &#x1f4cc; 一、前言&#xff1a;为什么不能只信本地时间&#xff1f; 在 Unity 游戏开发中&#xff0c;时间几…

Vue3 Composition API与十大组件开发案例详解

文章目录 一、Vue3核心API解析1.1 Composition API优势1.2 核心API 二、十大组件开发案例案例1&#xff1a;响应式表单组件案例2&#xff1a;动态模态框&#xff08;Teleport应用&#xff09;案例3&#xff1a;可复用列表组件案例4&#xff1a;全局状态通知组件案例5&#xff1…

Kafka 详细解读

1. Producer&#xff08;生产部卷王&#xff09; 职责&#xff1a;往 Kafka 里疯狂输出数据&#xff0c;KPI 是「日抛式消息海啸」 职场人设&#xff1a; 白天开会画饼&#xff0c;深夜写周报的奋斗逼&#xff0c;口头禅是「这个需求今晚必须上线&#xff01;」代码里的「福报…

LicheeRV Nano 与Ubuntu官方risc-v 镜像混合

LicheeRV Nano 官方给的镜像并没有unbutu, unbutu官方有一个基于 LicheeRV Dock的镜像&#xff0c;想象能否将二者混合 &#xff08;1&#xff09;刷 LicheeRV Dock的镜像 nano无法启动 &#xff08;2&#xff09;将nano的boot分区替换掉 LicheeRV Dock的rootfs以外的分区也…

【模板匹配】图像处理(OpenCV)-part10

19.1模板匹配 模板匹配就是用模板图&#xff08;通常是一个小图&#xff09;在目标图像&#xff08;通常是一个比模板图大的图片&#xff09;中不断的滑动比较&#xff0c;通过某种比较方法来判断是否匹配成功,找到模板图所在的位置。 不会有边缘填充。 类似于卷积&#xff0c…

HTML:表格数据展示区

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>人员信息表</title><link rel"styl…

MySQL 的锁,表级锁是哪一层的锁?行锁是哪一层的锁?

MySQL 的锁层级与类型 在 MySQL 中&#xff0c;锁的层级和实现与存储引擎密切相关。 1. 表级锁&#xff08;Table-Level Locks&#xff09; &#xff08;1&#xff09;存储引擎层的表级锁 实现层级&#xff1a;存储引擎层&#xff08;如 MyISAM、InnoDB&#xff09;。特点&a…

阿里巴巴按图搜索1688商品(拍立淘) API 返回值说明

阿里巴巴按图搜索1688商品&#xff08;拍立淘&#xff09;API 返回值说明 阿里巴巴按图搜索1688商品&#xff08;拍立淘&#xff09;API 的返回值通常以 JSON 格式返回&#xff0c;包含搜索结果、商品信息、分页信息等。以下是具体的返回值说明&#xff1a; 1. 请求状态信息 …

基于esp32-s3,写一个实现json键值对数据创建和读写解析c例程

以下是一个基于 ESP32 - S3 使用 ESP - IDF 框架实现 JSON 键值对数据创建、读写和解析的 C 语言例程。 环境准备 确保你已经安装了 ESP - IDF 开发环境&#xff0c;并且可以正常编译和烧录代码到 ESP32 - S3 开发板。 代码示例 #include <stdio.h> #include <stri…

MyBatis-Plus 使用 Wrapper 构建动态 SQL 有哪些优劣势?

MyBatis-Plus (MP) 提供的 Wrapper (如 QueryWrapper, LambdaQueryWrapper, UpdateWrapper, LambdaUpdateWrapper) 是其核心特性之一&#xff0c;它允许我们在开发时以面向对象的方式构建 SQL 的 WHERE 条件、ORDER BY、SELECT 字段列表等部分。与传统的 MyBatis 在 XML 文件中…

STM32与i.MX6ULL内存与存储机制全解析:从微控制器到应用处理器的设计差异

最近做FreeRTos&#xff0c;以及前面设计的RVOS&#xff0c;这种RTOS级别的系统内存上的分布与CortexA系列里面的分布有相当大的区别&#xff0c;给我搞糊涂了。 目录 STM32&#xff08;Cortex-M系列&#xff09;的内存与存储机制 Flash存储内容RAM存储内容启动与运行时流程示例…

Eteam 0.3版本开发规划

Eteam 0.1系列经历了3个小版本&#xff0c;主要完成了团队资料库功能。 Eteam 0.2系列经历了22个小版本&#xff0c;主要完成了白板和AI交互的能力。 目前的问题 目前白板上的数据有两个来源&#xff0c;团队资料库和外部数据。外部数据和团队资料库数据边界不是很清晰。 0.3版…

HTML5好看的水果蔬菜在线商城网站源码系列模板5

文章目录 1.设计来源1.1 主界面1.2 关于我们1.3 商品服务1.4 果蔬展示1.5 联系我们1.6 商品具体信息1.7 登录注册 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeigh 文章地址&#…

深入理解Java包装类:自动装箱拆箱与缓存池机制

深入理解Java包装类&#xff1a;自动装箱拆箱与缓存池机制 对象包装器 Java中的数据类型可以分为两类&#xff1a;基本类型和引用类型。作为一门面向对象编程语言&#xff0c; 一切皆对象是Java语言的设计理念之一。但基本类型不是对象&#xff0c;无法直接参与面向对象操作&…

uniapp自定义拖拽排列

uniapp自定义拖拽排列并改变下标 <!-- 页面模板 --> <template><view class"container"><view v-for"(item, index) in list" :key"item.id" class"drag-item" :style"{transform: translate(${activeInde…

基于SpringBoot的课程管理系统

前言 今天给大家分享一个基于SpringBoot的课程管理系统。 1 系统介绍 课程管理系统是一种专门为学校设计的软件系统&#xff0c;旨在帮助学校高效地管理和组织各类课程信息。 该系统通常包括学生、教师和管理员三大角色。 他们可以通过系统进行选课、查看课程表、考试、进…