如何在命名空间范围内转发声明constexpr对象?

时间:2013-11-13 16:16:14

标签: c++ gcc c++11 clang

在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?

2 个答案:

答案 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