在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 bug?
答案 0 :(得分:5)
我在C ++ 11标准的副本中找不到明确禁止constexpr
的任何语言 - 来自声明和定义之间的错误匹配,但我确实看到语言明确禁止{{ 1}}与constexpr
一起使用(第7.1.5节),我也看到语言要求类级别extern
static
变量的初始化程序在类中。此外,由于当变量或其类型的定义不可用时,constexpr
的效用显着降低,我认为可能的意图是必须定义constexpr
变量(或者,{{1}声明它们时的类成员,已初始化。
作为解决方法,也许您可以为变量提供constexpr
别名。这将允许您获取其地址,这是我能够想到的前瞻性声明允许的唯一内容。例如:
static
旁注:我知道在C ++ 14中,他们重新访问/正在重新访问extern
,因此它可能在Clang中起作用,因为它正在实现C ++ 14的一些草案规范。
答案 1 :(得分:4)
真正的答案是,gcc是完全错误的,铿锵是对的。上面的代码应该编译,它将在gcc 4.9中。或者说this bug report。