为何被声明为constexpr的函数必须同时具备inline属性?
为什么constexpr函数隐含inline属性?
编译期求值的刚需
constexpr函数的核心作用之一是支持编译期计算,这要求编译器在每个调用点都能拿到函数的完整定义——毕竟要在编译阶段直接算出结果,总不能让编译器去链接阶段找函数实现吧?而inline函数的特性正好允许函数定义出现在多个编译单元里(只要内容一致),不会触发重复定义的链接错误,完美适配这种需要随处可见定义的场景。ODR(单定义规则)的兼容
C++规定,除了少数例外(比如inline函数、模板),同一个实体在整个程序里只能有一个定义。constexpr函数通常会放在头文件中被多个源文件包含,如果它不是inline的,每个包含头文件的源文件都会生成一份函数定义,链接时就会报"multiple definition"错误。把constexpr隐式设为inline,正好符合ODR的例外规则,避免了这个问题。标准设计的逻辑一致性
从C++11引入constexpr开始,标准就把它和inline绑定了——毕竟两者的设计目标有重叠:inline是为了让函数能在头文件安全复用,constexpr是为了让函数能在编译期复用,两者都需要打破普通函数的单定义限制。与其让开发者手动加inline,不如直接让constexpr默认带inline属性,减少冗余代码和错误概率。
举个简单例子:
// 头文件math.h constexpr int square(int x) { return x * x; } // 隐式inline // a.cpp #include "math.h" int val_a = square(5); // b.cpp #include "math.h" int val_b = square(10);
如果square不是inline的,链接时会因为两个源文件都有square的定义报错;但因为constexpr隐含inline,链接器会自动合并这些定义,不会出问题。
内容的提问来源于stack exchange,提问作者Oodini
相关产品推荐
相关产品推荐

