簡體   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