このコード スニペットでは:
template<class T, int Min, int Max>
class Range
{
const T min_ = Min; // works without const
T max_ = Max;
};
エラーが発生します
ctor のないクラスの非静的 const メンバー
しかし、クラスで初期化する場合、これは関係ありません。それはバグとして記録されるべきですか?
エラーではなく警告が表示されますが、おそらくそれを-Werror
エラーに変えるために使用しています。違いを見分ける方法を学ぶ必要があるため、警告が役に立たない場合はエラーを無効にすることができます。[-Wuninitialized]
警告は、たとえばこの場合、行末に関連する警告オプションを表示し-Werror
、コンパイラに出力させます:
cc1plus: all warnings being treated as errors
または-Werror=uninitialized
cc1plus: some warnings being treated as errors
警告が正しくないため、バグとして報告しました: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53594
はい。暗黙のコンストラクターにはこれらの初期化子が含まれているため、エラーは発生しません。§12.1/6:
暗黙的に定義されたデフォルト コンストラクターは、ctor-initializer (12.6.2) と空の複合ステートメントを使用せずに、そのクラスのユーザー作成のデフォルト コンストラクターによって実行されるクラスの初期化のセットを実行します。そのユーザー作成のデフォルト コンストラクターの形式が正しくない場合、プログラムは形式が正しくありません。
および 12.6.2/8:
非委任コンストラクターで、特定の非静的データ メンバーまたは基底クラスが mem-initializer-id によって指定されていない場合 (コンストラクターに ctor-initializer がないために mem-initializer-list がない場合を含む)エンティティが抽象クラス (10.4) の仮想基底クラスではない場合、
— エンティティがブレースまたはイコール初期化子を持つ非静的データ メンバーである場合、エンティティは 8.5 で指定されているように初期化されます。