4

重複の可能性:
初期化されていないconst

constオブジェクトを初期化する必要があることを理解しています。

したがって、次のコードの場合、

class sample
{};

int main()
{
   const sample obj;
   return 0;
}

constオブジェクトが初期化されていないため、コンパイラは文句を言いobjます。

しかし、デフォルトのコンストラクターを使用してコード(以下に表示)を変更すると、コンパイラーはエラーをスローしません。

class sample
{
    public:
       sample() { }
};

int main()
{
    const sample obj;
    return 0;
}

新しく追加されたデフォルトのコンストラクターがコンパイラーを満足させることは何ですか?

4

2 に答える 2

5

新しく追加されたデフォルトのコンストラクターがコンパイラーを満足させることは何ですか?

これは、修飾子を使用してオブジェクトを宣言するときにC++標準によって課せられる要件だからconstです。

参照:

C ++ 03 8.5イニシャライザー8デクラ
レーター§9:

オブジェクトに初期化子が指定されておらず、オブジェクトが(おそらくcv修飾された)非PODクラスタイプ(またはその配列)である場合、オブジェクトはデフォルトで初期化されます。オブジェクトがconst修飾型の場合、基礎となるクラス型には、ユーザーが宣言したデフォルトのコンストラクターが必要です。それ以外の場合、非静的オブジェクトに初期化子が指定されていない場合、オブジェクトとそのサブオブジェクト(存在する場合)の初期値は不確定です90)。オブジェクトまたはそのサブオブジェクトのいずれかがconst修飾型である場合、プログラムの形式が正しくありません。

于 2012-01-21T10:37:24.930 に答える
2

const修飾型のデフォルトの初期化を行っています。C ++(C ++ 11ドラフトn3290)標準には、それについて次のように書かれています(§8.5/ 6イニシャライザー):

プログラムがconst修飾型Tのオブジェクトのデフォルトの初期化を要求する場合、Tはユーザー提供のデフォルトコンストラクターを持つクラス型でなければなりません。

最初のサンプルはこれに準拠していません(ユーザー提供のコンストラクターはありません)。2番目はそうです。

于 2012-01-21T10:36:36.320 に答える