今天谈谈 inline constexpr。 上次讲过 static constexpr,它用于 function scope/class scope ,此时 constexpr 会隐式 inline (class scope),static 则表示存储时期为 static。组合起来使用,一是能够直接在类中初始化通过 default member initializer 定义静态成员,二是所有对象能够共享数据,三是可以强保证发生于编译期,四是能够强保证 Lambdas 隐式捕获此数据。同时,也能够解决 SIOF。 上次也讲过 static inline,但是没有谈及 inline constexpr。 讨论之前,大家再回忆一个提过的准则:constexpr 在 file scope 下会隐式 internal linkage。 所以在 file scope 下不会写 static constexpr,这里的 static 是冗余的。但是单独只写一个 constexpr 修饰数据,默认的 internal linkage 会导致在多个 TUs… Continue Reading T230707 inline constexpr

C++20 新增了两个 const 相关的关键字,于是当前存在四个相似的关键字:const,constexpr,consteval 和 constinit。 接下来分别来进行讨论。 第一,经过 const 修饰的变量具有只读属性,并且初始化发生于运行期。也就是说,若一个变量定义之后不允许被修改,就应该给它加上 const。若在一个成员函数中不修改任何成员变量,就应该在成员函数后面加上 const。但是,它也可能发生于编译期,例如以 const int 代替宏来定义数组大小。 第二,经过 constexpr 修饰的变量或是函数,既保证只读,又发生于编译期。然而,只有在参数是常量,和显式地以其返回值来初始化一个编译期常量时,它修饰的函数才会一定发生于编译期。如: constexpr int sqr(int n) { return n * n; } int main() { // compile time static_assert(sqr(10) == 100); // compile time int array[sqr(10)]; // compile time constexpr int res = sqr(10);… Continue Reading Differences between keywords constexpr, consteval and constinit