获取 constexpr 全局变量(不是静态成员)的链接器符号

Getting a linker symbol for a constexpr global variable (not a static member)

本文关键字:链接 符号 静态成员 constexpr 全局变量 获取      更新时间:2023-10-16

我可以为静态成员编写以下内容:

// foo.h
struct A {
    static constexpr int x = 2;
};
// foo.cpp
constexpr int A::x;

是否可以对顶级变量执行相同的操作? 这在 C++11 中不起作用:

// foo.h
constexpr int x = 2;
// foo.cpp
constexpr int x;

它失败并显示:

<source>:3:15: error: redefinition of 'constexpr const int x'

向表达式添加静态也无济于事。我知道一种解决方法是仅将其设置为静态成员,但我想了解为什么非成员版本不起作用。

这是一个

PEBKAC。你可以获取 constexpr 变量的地址:

constexpr int x = 2;
const int* const f() {
    return &x;
}

这工作正常:生成x的链接器部分,并且此声明重复多少次并不重要。因此,实际上没有任何充分的理由想要做静态 constexpr 成员所需的相同习语。