次の例を検討してください
struct Foo
{
int bar;
Foo(int i):bar(i){cout << "real ctor\n";}
Foo(){cout << "default ctor\n";}
};
int main()
{
Foo fooArr[3];//default ctor called 3 times
for(int i=0;i!=3;++i)cout << fooArr[i].bar << endl;//bare memory junk
cout << endl;
vector<Foo> fooVec;
for(int i=0;i!=3;++i){
fooVec.push_back(Foo(i)); //only real ctor called
cout << fooVec[i].bar << endl;//real thing
}
cout << endl;
int iArr[3];
for(int i=0;i!=3;++i)cout << iArr[i] << endl;//bare memory junk
}
Foo
私の設計にないため、ユーザーがデフォルトのコンストラクターを呼び出すことは望ましくありません。しかし、ユーザーが の配列を使用できるようにしたいのですがFoo
、それをサポートするために、無意味で紛らわしい Foo::Foo() を提供することを余儀なくされました。なぜC++標準がプログラマーにそのようなことを強制するのか理解できません。その背後にある理論的根拠は何ですか?矛盾の理由は?これを理解した頭のいい人は、私に説明してくれませんか? 前もって感謝します!