clang (トランク) では、後でconstexpr
次のように定義されるオブジェクトを前方宣言できます。
// Fwd-declarations
struct S;
extern const S s;
// (... later) definitions
struct S {};
constexpr S s {};
Gcc 4.8 はこれを好まず、前方宣言と定義の違いを教えてくれますconstexpr
。gcc は真実を語っていますか、それとも gcc の単なるバグですか?
constexpr
私の C++11 標準のコピーには、明示的に-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
C++14 のドラフト仕様を実装しているため、Clang で機能する可能性があります。