C++14中引用constexpr变量为何会导致链接错误?
C++14中static constexpr成员的链接问题解析
在C++14的标准规则下,static constexpr类成员变量的处理逻辑分两种场景:
仅使用常量值的情况(比如第二个直接输出
D::n的代码)
编译器会直接把D::n替换成它的字面常量值5,不需要这个变量在内存中存在实际的实体。类内的static constexpr int n = 5;已经足够让编译器获取到值,所以代码可以正常编译链接并运行。需要内存实体的情况(比如第一个传递
D::n给引用参数的代码)
当你把D::n绑定到const int&类型的引用时,引用必须关联到一个真实存在的内存对象。但在C++14中,类内的static constexpr声明只是声明而非完整定义,没有为变量分配实际的内存空间,因此链接器会找不到D::n的实体,报出undefined reference to D::n的错误。
如果要让第一个代码在C++14环境下正常运行,需要在类外部补充D::n的定义:
struct D { static constexpr int n = 5; }; // C++14必须添加的类外定义 constexpr int D::n; int inc(const int& n) { return n; } int main() { std::cout << inc(D::n) << std::endl; }
而C++17对这个规则做了优化:static constexpr类成员默认被视为inline变量,类内的声明同时就是完整定义,不管是直接使用值还是绑定引用/取地址,都不需要额外的类外定义,两种代码都能正常运行。
内容的提问来源于stack exchange,提问作者fabiop
相关产品推荐
相关产品推荐

