8

この質問では、ユーザーHappyMittalがC++ 03標準のセクション12.2.5を引用しています。コンストラクターのctor-initializer(12.6.2)の参照メンバーへの一時的なバインドは、コンストラクターが終了するまで持続します

とにかくそれはどのように役立つことができますか?つまり、コンストラクターが終了すると一時的に破棄されますが、参照はバインドされたままになります。これで、既に破棄されたオブジェクトになります。

外側のオブジェクトの存続期間全体にわたってぶら下がっている参照がまだある場合、一時的な存続期間を慎重に指定することのポイントは何ですか?この動作はどのシナリオで役立ちますか?

4

3 に答える 3

8

参照メンバーをデッドオブジェクトにバインドすることは有用ではありませんが、参照にバインドされたときの「通常の」一時的な有効期間の延長はこの場合には適用されないことを明確にすることは有用です。

また、ctor初期化子に特別に適用される一時的な有効期間の延長を指定します。これは、ctor本体が実行される前に終了するのではなく、ctorの最後まで延長されます。これは、要点がctorの実行である「賢い」クラスを除いては役に立ちません。また、このタイプの(乱用)使用は当然避けられます。

後者の実例はわかりませんが、デストラクタがデフォルトで、生涯で「賢い」クラスとその使用方法を破ったことに似ています。これには実際の使用法があり、C++0xでdtorのデフォルトのセマンティクスを処理する方法についての議論で出てきました。

于 2011-01-18T08:35:55.347 に答える
2

D言語では、構築プロセスをある程度自由に書くことができます。ただし、C ++では、構築/初期化の順序が厳密に規定されています。したがって、クラスの初期化にコストのかかる計算が必要な場合は、次のようなコードが気が進まない回避策として有効な場合があります。

struct S {
  Args const &r;
  A a;
  B b;
  S( args.... )
    : r( expensive_func( args.... ) ), a( r.for_a ), b( r.for_b ) {}
};
于 2011-01-18T12:31:33.247 に答える
1

コンパイラの作成者にとって便利です。スコープの最後にバインドされた一時オブジェクトを破棄するロジックがすでに用意されており、コンストラクターの終了はそのようなポイントの1つです。このルールを使用すると、コンパイラはそのポイントを再利用して、そのような一時的なものも破棄できます。

標準は実際にある程度の存続期間を決定する必要があり、他の唯一の合理的なポイントは、ctor初期化子リストの後、ctor本体の前であることに注意してください。try {} catch()これは、一時的なものが破壊されるポイントではなく、関数スコープのブロック(ctor初期化子リストを含む)に干渉する可能性があります。

于 2011-01-18T13:15:01.263 に答える