C++20新特性_std::is_constant_evaluated() 编译期判断

文章目录

  • [第二章 C++20标准库特性](#第二章 C++20标准库特性)
    • [2.8 std::is_constant_evaluated() 编译器判断](#2.8 std::is_constant_evaluated() 编译器判断)

本文记录C++20新特性之std::is_constant_evaluated() 。

第二章 C++20标准库特性

2.8 std::is_constant_evaluated() 编译器判断

C++20引入了std::is_constant_evaluated(),包含在头文件<type_traits>中,主要作用判断当前函数调用是否正在一个编译期间常量上下文中执行。

如果是在编译期求值(例如,在初始化 constexpr 变量、static_assert 中,或在 consteval 函数内),返回 true。

如果是在运行时求值,返回 false。

这个函数引入的核心价值在于,允许我们编写一个既能用于编译期也能用于运行时的 constexpr 函数,并为这两种情况提供不同的实现路径。这解决了 constexpr 函数的一个痛点:有些操作(如调用非 constexpr 的库函数、I/O 操作)在运行时是允许的,但在编译期是禁止的。

下面实现一个更智能的 power函数:

cpp 复制代码
    constexpr double power(double base, int exp)
    {
        // 检查当前调用是否在编译期常量上下文中
        if (std::is_constant_evaluated())
        {
            // 编译期路径:使用简单的循环
            // 这个实现对编译器友好
            double res = 1.0;
            for (int i = 0; i < exp; ++i) {
                res *= base;
            }
            return res;
        }
        else
        {
            // 运行时路径:调用标准库中更高效的函数
            // std::pow 不是 constexpr,所以不能在编译期路径中使用
            return std::pow(base, exp);
        }
    }
    void test()
    {
        // 1 编译期求值
		// 一个constexpr ,所以会在编译期计算
		constexpr double compiled_result = power(2.0, 10);
		cout << "Compiled Result: " << compiled_result << endl;
		static_assert(compiled_result == 1024.0,"非编译期间计算");

        // 2 运行时求值
        double runtime_base = 2.0;
        int runtime_exp = 10;
        double runtime_result = power(runtime_base, runtime_exp);
		cout << "Runtime Result: " << runtime_result << endl;
    }

test() 函数分别演示了在编译期(初始化 constexpr 变量)和运行时调用 power 函数的场景。通过这种方式,std::is_constant_evaluated() 极大地增强了 constexpr 的灵活性,让开发者可以编写出在不同求值阶段都能以最优方式执行的统一接口。

相关推荐
小小龙学IT5 天前
C++ std::chrono 时间库深度解析:从 duration 模板到 C++20 日历与时区
linux·c++·c++20
郝学胜-神的一滴7 天前
C++20 高级编程 004:从初始化、内存到const系列关键字
开发语言·算法·编程·软件构建·c++20
可爱系程序猿7 天前
msvcp120.dll 加载失败排查:VC++ 2013、进程架构与插件私有目录如何对应
程序人生·电脑·c++20
ShineWinsu7 天前
对于C++:C++20中线程、初始化、Lambda与内存视图等特性的解析
c++·c++20
可爱系程序猿8 天前
mfc100.dll 加载失败排查:旧版 VC++ 2010 程序、位数与插件目录如何核对
程序人生·电脑·c++20
ShineWinsu11 天前
对于 C++:C++20中Concept(概念) 与 Coroutine(协程)的解析
linux·开发语言·网络·c++·c++20·epoll
Lzg_na18 天前
C++20 Concept 核心概念、语法详解与三大工程实践场景
c++20
Billy1213818 天前
Day14-C++20 Modules:模块声明与导入、模块分区、与头文件对比、迁移策略
c++20·c++进阶学习
程序猿编码18 天前
不用GPU,不用多线程,我用C++20手写了一个Gemma 3推理引擎
pytorch·语言模型·大模型·c++20·推荐算法
Billy1213820 天前
Day15-C++20 三路比较运算符 `<=>`:一次定义,全面排序
c++20·c++进阶学习