4

静的型付けに関する最近の質問の後、私は再び配列について考えていました。配列要素は普通のオブジェクトだといつも思っていましたが、今では疑問に思っています:

配列の要素はそれ自体で完全なオブジェクトですか、それとも不完全であり、唯一の完全なオブジェクトは配列自体ですか?

この場合、 の完全なオブジェクトは(new T[N])[0]何ですか? その型は何ですか?

要素が不完全な場合、静的に型を認識できない完全なオブジェクトが存在することを意味しますか? (これはベース/派生ビジネスとは異なります: のタイプnew Derived 静的に知られていますが、その式の外に記録されることはありません。)

4

1 に答える 1

4

配列要素は完全なオブジェクトではありません。C++11、[intro.object]§2:

オブジェクトには、サブオブジェクトと呼ばれる他のオブジェクトを含めることができますサブオブジェクトは、メンバー サブオブジェクト(9.2)、基本クラス サブオブジェクト(条項 10)、または配列要素のいずれかです。他のどのオブジェクトのサブオブジェクトでもないオブジェクトは、完全なオブジェクトと呼ばれます。

については(new T[N])[0]。完全なオブジェクトは、new-expression (の配列T) によって作成されたオブジェクトです。[expr.new]§1に従って、そのタイプは「のN要素の配列」だと思います:T

new-expressionは、それが適用されるtype-idまたはnew-type-idのオブジェクトを作成しようとします。

ここでは、から構築されたnew-type-idT[N]です。

配列を作成する場合、 new-expressionは、配列自体ではなく、その配列の最初の要素へのポインターを返すことに注意してください。つまり、そのような場合、new-expressionの型は、それが作成する完全なオブジェクトの型ではありません。つまり、完全なオブジェクトの型には決してアクセスできません。

于 2013-10-02T08:34:03.493 に答える