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これは、せいぜい、何かを説明するための自然言語の使用が非常に不明確です。