11

constexpr次のように変数テンプレートを前方宣言しようとしました。

template<typename>
constexpr std::size_t iterator_category_value;

目標は、すべての特殊化が必要であることを文書化することconstexprでしたが、それが合法であるかどうかを確認したことがなく、g++ はそれに満足していたことを認めなければなりません。しかし、代わりにこのスピンネットを clang++ でコンパイルしようとすると、次のエラーが発生しました。

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、変数テンプレートではない前方宣言された変数について不平を言っているため、変数テンプレートのコンテキストがコンパイラの意見を異にしているようです。

4

2 に答える 2

9

C++14 標準では、初期化が必要であることは明らかです。セクション 7.5.1 パラグラフ 9 から、

constexprオブジェクト宣言で使用される指定子は、オブジェクトを const として宣言します。そのようなオブジェクトはリテラル型を持ち、初期化されます。

「オブジェクト宣言」の正確な意味については、セクション 7 パラグラフ 7 に次のように記載されています。

decl-specifier-seq に typedef 指定子が含まれていない場合、名前に関連付けられた型が関数型の場合は関数宣言と呼ばれ、それ以外の場合はオブジェクト宣言と呼ばれます。

于 2015-10-18T12:56:44.630 に答える