1

このコード スニペットでは:

template<class T, int Min, int Max>
class Range
{
    const T min_ = Min; // works without const

    T max_ = Max;

};

エラーが発生します

ctor のないクラスの非静的 const メンバー

しかし、クラスで初期化する場合、これは関係ありません。それはバグとして記録されるべきですか?

4

2 に答える 2

2

エラーではなく警告が表示されますが、おそらくそれを-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

于 2012-06-06T16:53:13.640 に答える
2

はい。暗黙のコンストラクターにはこれらの初期化子が含まれているため、エラーは発生しません。§12.1/6:

暗黙的に定義されたデフォルト コンストラクターは、ctor-initializer (12.6.2) と空の複合ステートメントを使用せずに、そのクラスのユーザー作成のデフォルト コンストラクターによって実行されるクラスの初期化のセットを実行します。そのユーザー作成のデフォルト コンストラクターの形式が正しくない場合、プログラムは形式が正しくありません。

および 12.6.2/8:

非委任コンストラクターで、特定の非静的データ メンバーまたは基底クラスが mem-initializer-id によって指定されていない場合 (コンストラクターに ctor-initializer がないために mem-initializer-list がない場合を含む)エンティティが抽象クラス (10.4) の仮想基底クラスではない場合、

— エンティティがブレースまたはイコール初期化子を持つ非静的データ メンバーである場合、エンティティは 8.5 で指定されているように初期化されます。

于 2012-06-06T16:06:04.843 に答える