[英]Why can't I forward-declare a class in a namespace using double colons?
[英]How do I forward-declare a constexpr object at namespace scope?
在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?
我在C ++ 11标准的副本中找不到任何语言明确禁止constexpr
-ness从声明和定义之间的错误匹配,但我确实看到语言明确禁止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中,他们重新访问/正在重新访问constexpr
,因此它可能在Clang中起作用,因为它正在实现C ++ 14的一些草案规范。
真正的答案是gcc是完全错误的,clang是对的。 上面的代码应该编译,它将在gcc 4.9中。 或者说这个错误报告 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.