![](/img/trans.png)
[英]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.