0

このコードを検討してください:

int main()
{
    int i(6); //this will result in i==6,but consider next initializations

    int j(int()); 

    T * p2 = new T(); 
}

jの値は1であることがわかりましたが、は値が0int()に等しい一時的なものであるため、これは0である必要があります。

また、new演算子の構文はですnew typenameが、ここT()では型名の代わりに一時オブジェクトになります。

4

2 に答える 2

4
int j(int()); 

これはオブジェクトを宣言しません。代わりに、関数を引数として受け取る関数を宣言し、 を返しますint。引数として取る関数の型は次のとおりです。

 typedef int (*funtype)();

つまり、 を返しint、引数として何もとらない関数です。

このような宣言の解析は、一般に次のように知られています。


new構文ではT()、一時オブジェクトを作成しません。それはそれがどのように見られるべきかではありません。new T()代わりに、最初に type のオブジェクトにメモリを割り当てT、次にそのメモリ内にオブジェクトを構築する式全体を調べる必要があります。がユーザー定義型の場合T、メモリを割り当てた後、既定のコンストラクターを呼び出してオブジェクトを構築します。

于 2012-02-19T06:52:59.053 に答える
1

また、新しい演算子の構文は typename *variable_name = new typename ですが、ここT()では一時オブジェクトになりますが、型名ではありません。

Most Vexing Parse と同様に、T()コンテキストに応じて異なる意味を持ちます。常に一時的なものを生成するとは限りませんが、通常は新しい匿名オブジェクトまたはサブオブジェクトを初期化します。オブジェクトは

  • 一時的な ifT()が式の中にあり、
  • T()コンストラクターで本体の前にある場合は基本サブオブジェクト、または
  • T()の後に表示される場合は、ポインターの指示対象newポインターには名前がありますが、オブジェクトは匿名であることに注意してください。

new Tnew T()一部の型でnew Tは、値を初期化しないままにします。(正式な用語はdefault-initializationです。) 基本サブオブジェクトまたは一時オブジェクトに対応する文法構造はありません。基本サブオブジェクトは初期化子を省略してデフォルトで初期化され、一時オブジェクトはデフォルトで初期化できません。これらすべてのケースで、コンストラクターを定義すると呼び出され、コンストラクターは常に定義する必要があり、常にすべてのメンバーを初期化する必要があるため、違いはわずかです。例外は、 などの基本的な型intと のような単純な構造ですstd::array<char, 1000>

安全を期すために、コンストラクターがない場合に物事が適切にゼロ化されることを確認するためだけにnew T、回避することをお勧めします。new T()

于 2012-02-19T07:30:28.753 に答える