3

Stroustrup のThe C++ Programming Language (第 4 版はこちら)の §6.3.5.1 の最後の文は次のとおりです。

配列または構造体が初期化されている場合、配列またはクラスのメンバーはデフォルトで初期化されます。

ただし、このテストは、デフォルトの初期化されたオブジェクトの初期化されていないメンバーを示しています(私も試しましたg++4.7 -std=c++11

#include <iostream>

struct Foo
{
    int i;

    Foo();
};

Foo::Foo() {}

int main()
{
    Foo f;
    std::cout << "f.i: " << f.i << std::endl;

    return 0;
}

私は何かが欠けているに違いありませんが、Stroustrup の肯定にエラーを意味しない説明はありますか?


編集:回答の後、初期化されたデフォルトの概念には、テキストの他の部分(たとえば、§17.3.1)で初期化されていないものと呼ばれるものが含まれることになっていることを理解しました。これは私には非常に不明確に聞こえます。実際、「明示的にユーザー初期化されていない」以外の意味でuninitializedを使用するのは矛盾しています(その場合のように) 。X と非 X が反対の排他的な集合を分類するという自然言語の証拠を取り除かない限り...

また、同じセクションの前の文 (§6.3.5.1) には次のように書かれています。

ローカル変数 [...] は、デフォルトのコンストラクターを持つユーザー定義型でない限り、デフォルトでは初期化されません [...]

ここでも矛盾が露呈。最初のステートメントと後のステートメントの両方が true であることを受け入れることは、同時にデフォルトで初期化され、デフォルトで初期化されない変数 (つまり、ローカル変数) があることを意味します。

IMHOこれは、せいぜい、何かを説明するための自然言語の使用が非常に不明確です。

4

1 に答える 1

6

§ 8.5/7 によると:

タイプ T のオブジェクトをデフォルトで初期化するとは、次のことを意味します。
— T が (おそらく cv 修飾された) クラス タイプである場合 (第 9 節)、T のデフォルト コンストラクターが呼び出されます (T にアクセス可能なデフォルトがない場合、初期化は不正な形式になります)。コンストラクタ);
— T が配列型の場合、各要素はデフォルトで初期化されます。
— それ以外の場合、初期化は実行されません。

int最後のポイントに該当するため、初期化されないままになります。メンバーの型が の場合std::string、既定のコンストラクターが呼び出されstd::string、空の文字列が作成されます。

于 2013-07-04T20:20:11.150 に答える