また、新しい演算子の構文は typename *variable_name = new typename ですが、ここT()
では一時オブジェクトになりますが、型名ではありません。
Most Vexing Parse と同様に、T()
コンテキストに応じて異なる意味を持ちます。常に一時的なものを生成するとは限りませんが、通常は新しい匿名オブジェクトまたはサブオブジェクトを初期化します。オブジェクトは
- 一時的な if
T()
が式の中にあり、
T()
コンストラクターで本体の前にある場合は基本サブオブジェクト、または
T()
の後に表示される場合は、ポインターの指示対象new
。ポインターには名前がありますが、オブジェクトは匿名であることに注意してください。
new T
new T()
一部の型でnew T
は、値を初期化しないままにします。(正式な用語はdefault-initializationです。) 基本サブオブジェクトまたは一時オブジェクトに対応する文法構造はありません。基本サブオブジェクトは初期化子を省略してデフォルトで初期化され、一時オブジェクトはデフォルトで初期化できません。これらすべてのケースで、コンストラクターを定義すると呼び出され、コンストラクターは常に定義する必要があり、常にすべてのメンバーを初期化する必要があるため、違いはわずかです。例外は、 などの基本的な型int
と のような単純な構造ですstd::array<char, 1000>
。
安全を期すために、コンストラクターがない場合に物事が適切にゼロ化されることを確認するためだけにnew T
、回避することをお勧めします。new T()