当前位置: 首页 > news >正文

8、constexpr if、inline、类模版参数推导、lambda的this捕获---c++17

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

  • 作用:在模板编程中,根据条件在编译时选择不同的代码路径,无需特化版本或复杂SFINAE技巧[替代SFINAE]。[SFINAE将在模版元编程再讲。下个月了。]
  • 基本语法
if constexpr (condition) {// 如果 condition 为 true,编译这部分
} else {// 如果 condition 为 false,编译这部分(可选)
}
  • condition 必须是编译时可求值的常量表达式(如 constexpr 变量、模板参数、sizeof 等)
  • 关键区别:与普通 if 不同,if constexpr 在编译时直接丢弃未选择的分支,不会检查语法有效性。

在这里插入图片描述

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

  • 作用:允许在头文件定义全局变量或类的静态成员变量,避免多次定义的链接错误。

  • 例子(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占位的非类型模版形参
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};}
};

相关文章:

  • PySide6 GUI 学习笔记——常用类及控件使用方法(常用类矩阵QRect)
  • 基于Spring AI Alibaba实现MCP协议的SSE实时流式服务深度解析
  • 力扣刷题 - 203.移除链表元素
  • leetcode(01)森林中的兔子
  • 六、小白如何用Pygame制作一款跑酷类游戏(静态障碍物和金币的添加)
  • 深入浅出:LDAP 协议全面解析
  • LangChain 单智能体模式示例【纯代码】
  • IPv6 公网设置技巧
  • 初识javascript
  • Sharding-JDBC 系列专题 - 第一篇:简介与快速入门
  • Cribl 对Windows-xml log 进行 -Removing filed-06
  • DSP28335入门学习——第一节:工程项目创建
  • SpringBoot 3 与 SpringDoc 打造完美接口文档
  • Centos9 离线安装 MYSQL8
  • Spring Boot集成MongoDB及实战技巧与性能调优
  • android framework开发的技能要求
  • 哈希表实现
  • 微前端框架 Wujie
  • python3GUI--仿网课答题播放器 By:PyQt5(分享)
  • System.out 详解
  • 浦江观察|3.6亿元消费券,为上海餐饮业带来了什么?
  • 中国乒乓球队公示多哈世乒赛参赛名单,王楚钦孙颖莎混双重组
  • “雷公”起诉人贩子王浩文案将开庭:索赔6元,“讨个公道”
  • 多元布局、抱团取暖……上海这个区和外向型企业坐到一起聊了什么
  • 大悦城:去年净亏损29.77亿元,三年累计亏损超70亿元
  • 观察|智驾监管升级挤掉宣传水分,行业或加速驶入安全快车道