在 clang (trunk) 上,我可以转发声明一个稍后将定义constexpr
如下的对象:
// Fwd-declarations
struct S;
extern const S s;
// (... later) definitions
struct S {};
constexpr S s {};
Gcc 4.8 不喜欢这样,告诉我前向声明和定义在constexpr
-ness 上有所不同。gcc 说的是真话,还是这只是 gcc 的错误?
我在我的 C++11 标准副本中找不到任何明确禁止constexpr
声明和定义之间不匹配的语言,但我确实看到明确禁止constexpr
使用的语言extern
(第 7.1.5 节) ,并且我还看到语言需要类级static
constexpr
变量的初始化程序才能在类中。constexpr
此外,由于当变量的定义或其类型不可用时,其效用会显着降低,我认为其意图很可能是在声明constexpr
变量时必须定义变量(或者,对于static
类成员,初始化)。
作为一种变通方法,也许您可以为变量提供extern
别名。这将允许您获取它的地址,这是我能想到的唯一的前向声明将允许的事情。例如:
// .hpp file:
struct C;
extern C const &c;
// .cpp file:
struct C {
constexpr C() { }
};
constexpr C cc;
C const &c = cc;
旁注:我知道在 C++14 中,他们 revisited/are revisiting constexpr
,所以它可能在 Clang 中工作,因为它正在实现 C++14 的一些草案规范。
真正的答案是 gcc 完全错误,clang 是正确的。上面的代码应该可以编译,它会在 gcc 4.9 中编译。或者说这个错误报告。