2015-10-18 3 views
9

を宣言しますそれは合法であるかどうかではなく、g ++はそれに満足していました。私が打ち鳴らすと、このスピンネットをコンパイルしようとしたときただし、++の代わりに、私は次のエラーを得た:はフォワード私は将来を宣言するために、このような<code>constexpr</code>変数テンプレートを試してみましたconstexprの変数テンプレート

error: default initialization of an object of const type 'const std::size_t' (aka 'const unsigned long') 
    constexpr std::size_t iterator_category_value; 
         ^
                = 0 

エラーが理にかなって、それが本当の問題ではないので、constexprを削除すると、それが消えます。しかし、私は今興味があります:標準は変数テンプレートのようなconstexprフォワード宣言を許可していますか、それとも違法ですか? g ++とclang ++は意見が違うようで、必要に応じてどこにバグレポートを提出するかを知りたいと思っています。

両方とも、変数テンプレートではない前方宣言されたconstepxr変数に対して不平を言います。そのため、変数テンプレートのコンテキストは、コンパイラを不一致にするようです。

+0

http://wg21.cmeerw.net/cwg/issue1712のテキストは、それを 'constexpr'としてフォワード宣言することはできませんが、stdがどのようにそれを禁止しているかはわかりません。変数テンプレートは、私の*オブジェクト宣言*のようには見えません。 – dyp

+0

OTOH、[dcl.dcl] p9は非常に一般的で、変数テンプレート(=>変数テンプレートはオブジェクト宣言=> 'constexpr'は初期化が必要です)に適用する必要があります – dyp

+0

@dyp Btw。現在Gitで入手可能な最新のソースをコンパイルしていませんか? – Columbo

答えて

8

C++ 14標準では、初期化が必要であることは明らかです。セクション7.5.1第9項、 "オブジェクト宣言"、第7節第7項状態の正確な意味については

A constexpr specifier used in an object declaration declares the object as const. Such an object shall have literal type and shall be initialized.

から:

If the decl-specifier-seq contains no typedef specifier, the declaration is called a function declaration if the type associated with the name is a function type and an object declaration otherwise.

8

クランは正しいです。可変テンプレートの宣言は、したがって、それは[dcl.constexpr]/9に従って初期化を提供する必要があり、オブジェクトの宣言([dcl.dcl]/9)は:方法は事実上存在しない

A constexpr specifier used in an object declaration declares the object as const . Such an object […] shall be initialized.

オブジェクトを最初にconstexprと宣言している "forward"の部分です。 constexprが変数の宣言に適用される場合は、定義([dcl.constexpr]/1)になります。

+0

[最近何か変わっていますか?](http:// coliru。 stacked-crooked.com/a/cb1d8ebe90a2bc11) – Orient

+0

説明したケースを含む単なるコード。 'constexpr'変数テンプレートの前方宣言を含みますが、コンパイルは正常です。 – Orient

+0

@Orientあなたはこの点で盗難されたコンパイラでコンパイルしていることに気付いていますか? – Columbo

関連する問題