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

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

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

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

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

  • 例子(c++17前的static 变量,需要再类的外面定义,类里面声明)

cpp 复制代码
// MyClass.h
class MyClass {
public:
    static int sharedValue; // 头文件中声明
};

// MyClass.cpp
int MyClass::sharedValue = 10; // 必须在一个.cpp文件中定义
  • 而c++17后,就只需要在static变量前面加inline,就可以定义了。
cpp 复制代码
// MyClass.h (C++17后)
class MyClass {
public:
    inline static int sharedValue = 10; // 直接初始化,无需外部定义
};

// 使用:多个.cpp文件可以安全包含此头文件

三、类模版参数推导

  • 作用:编译器根据构造函数参数自动推导类模板类型,简化代码。
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占位的非类型模版形参
cpp 复制代码
template<auto T>
void func1(){
    cout<<T<<endl;
}
int main(){
    func1<100>();//100
    return 0;
}

四、lambda的this捕获[*this]

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

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

cpp 复制代码
// 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++; // 操作的是副本的data
            std::cout << data << "\n"; // 输出43
        };

    }
};
相关推荐
笑虾10 小时前
Win10 修改注册表 让鼠标悬停PNG上时 tip 始终显示分辨率
开发语言·javascript·ecmascript
lolo大魔王10 小时前
Go语言的并发、协调创建和通信机制
开发语言·golang
xxyy88810 小时前
关于labelimg安装后在标注过程中闪退和死机的问题处理
开发语言·python
JAVA面经实录91711 小时前
Java开发工程基础完整手册(企业实战完整版)
java·开发语言·git·ci/cd·svn·github·intellij idea
样例过了就是过了11 小时前
LeetCode热题100 最长有效括号
c++·算法·leetcode·动态规划
Joseph Cooper11 小时前
Linux regmap 子系统实战:在驱动中 dump PMIC 寄存器定位供电问题
linux·运维·服务器
skywalk816311 小时前
【文言心】- 中文编程语言> 一门追求同像性(Homoiconicity)的中文编程语言,代码即数据,数据即代码。
开发语言
南境十里·墨染春水11 小时前
C++笔记 forward完美转发
开发语言·c++·笔记
代码羊羊11 小时前
Rust 格式化输出完全攻略:从入门到精通
开发语言·后端·rust
吃着火锅x唱着歌11 小时前
深度探索C++对象模型 学习笔记 第四章 Function语意学(2)
c++·笔记·学习