C++20新特性_consteval 和 constinit

文章目录

  • [第一章 C++20核心语法特性](#第一章 C++20核心语法特性)
    • [1.7 consteval 和 constinit](#1.7 consteval 和 constinit)
      • [1.7.1 consteval 和 constinit作用](#1.7.1 consteval 和 constinit作用)
      • [1.7.2 示例](#1.7.2 示例)
      • [1.7.3 const constexpr consteval constinit 对比](#1.7.3 const constexpr consteval constinit 对比)

本文记录C++20新特性之consteval 和 constinit。

第一章 C++20核心语法特性

1.7 consteval 和 constinit

在 C++11 引入 constexpr 之后,编译期计算(Compile-time Computation)的大门被彻底打开。但是,constexpr 有时过于"宽容"------它既可以在编译期运行,也可以在运行期运行,这导致了语义上的模糊。

为了更精准地控制编译期行为,C++20 引入了两个新的关键字:consteval 和 constinit。它们分别解决了"强制编译期执行"和"强制编译期初始化"这两个痛点。

1.7.1 consteval 和 constinit作用

consteval 告诉编译器,只能在编译期间计算。

constinit:告诉编译器,修饰的变量只能在编译期间确定好。

1.7.2 示例

cpp 复制代码
    // consteval 声明:此函数必须在编译期完成计算
    consteval int sqr(int n) {
        return n * n;
    }

    void test()
    {
        // 1 传入编译期常量,
        constexpr int r1 = sqr(33);

		// 2 传入 constexpr
		constexpr int x = 5;
        constexpr int r2 = sqr(x);

        // 3 传入非编译期常量,编译错误
        int y = 10;
		//int r3 = sqr(y); // 编译错误:必须在编译期求值

    }

示例2:测试 constinit

cpp 复制代码
    constexpr int get_initial_value()
    {
        return 42;
    }

    // 1. constinit 保证 global_x 在编译期完成初始化
    // 2. global_x 依然是可变的 (mutable)
    constinit int global_x = get_initial_value();

    // 错误示例:
    int runtime_val = 100;
    // constinit int err_val = runtime_val; // 编译错误!必须用常量表达式初始化

    int test()
    {
        std::cout << "Initial: " << global_x << std::endl; // 输出 42

        // 修改变量
        global_x = 100;
        std::cout << "Modified: " << global_x << std::endl; // 输出 100

        return 2;
    }

1.7.3 const constexpr consteval constinit 对比

对比:

相关推荐
keep intensify1 天前
C++20线程池
c++·算法·c++20
繁华的地方不一定留下你的脚印6 天前
C++20 concepts:把模板要求写在入口,而不是等一屏报错
c++20
码匠许师傅6 天前
【C++三方组件】Asio 下篇:C++20 协程版 TCP 客户端与服务端
c++·tcp/ip·c++20
啦啦啦啦啦zzzz23 天前
利用RAII机制进行日志的采集
linux·服务器·c++·网络编程·c++20
啦啦啦啦啦zzzz24 天前
Logger的组装(c++20)
c++·算法·c++20
啦啦啦啦啦zzzz1 个月前
Appender抽象类的实现c++20
linux·服务器·c++·c++20
OPEN-F1 个月前
C++20新特性精讲:概念、范围与三路比较
算法·c++20
小小龙学IT1 个月前
C++ std::chrono 时间库深度解析:从 duration 模板到 C++20 日历与时区
linux·c++·c++20
郝学胜-神的一滴1 个月前
C++20 高级编程 004:从初始化、内存到const系列关键字
开发语言·算法·编程·软件构建·c++20
可爱系程序猿1 个月前
msvcp120.dll 加载失败排查:VC++ 2013、进程架构与插件私有目录如何对应
程序人生·电脑·c++20