繁体   English   中英

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

[英]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从声明和定义之间的错误匹配,但我确实看到语言明确禁止constexprextern (第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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM