C++ 面试题
目录

C++20 中 consteval 和 constinit 的用法?

· 约 2 分钟读完 · 第 148 / 181 章

推荐答案

本题详细解读

consteval 的用法

consteval 是 C++20 引入的一个新关键字,用于声明一个立即函数(immediate function)。立即函数必须在编译时求值,且只能在编译时调用。这意味着 consteval 函数的返回值必须是编译时常量。

  • 语法:consteval 返回类型 函数名(参数列表) { 函数体 }
  • 特点:
    • 只能在编译时调用,不能在运行时调用。
    • 函数体中的表达式也必须在编译时求值。
    • 适用于需要强制在编译时求值的场景。

constinit 的用法

constinit 是 C++20 引入的另一个关键字,用于确保一个变量在编译时被初始化。它主要用于全局或静态变量,确保这些变量在程序启动时就已经被初始化,而不是在运行时才进行初始化。

  • 语法:constinit 类型 变量名 = 初始化表达式;
  • 特点:
    • 只能用于静态存储期的变量(如全局变量、静态局部变量)。
    • 初始化表达式必须是编译时常量。
    • 不能用于动态初始化的变量。

示例代码解析

在示例代码中:

  • square 函数被声明为 consteval,因此它必须在编译时求值。square(10) 的结果是 100,这是一个编译时常量。
  • globalValue 被声明为 constinit,并且用 square(10) 的结果进行初始化。由于 square(10) 是编译时常量,globalValue 在程序启动时就已经被初始化为 100。

注意事项

  • consteval 和 constinit 都要求编译时求值,因此它们的使用场景有限,通常用于需要高性能或严格编译时计算的场景。
  • constinit 不能用于动态初始化的变量,因此在使用时需要确保初始化表达式是编译时常量。