8

在 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 的错误?

4

2 回答 2

5

我在我的 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 的一些草案规范。

于 2013-11-13T23:50:00.540 回答
4

真正的答案是 gcc 完全错误,clang 是正确的。上面的代码应该可以编译,它会在 gcc 4.9 中编译。或者说这个错误报告

于 2013-11-19T01:29:22.447 回答