1

を使用して一時オブジェクトを作成class-type-name(parameters).memberし、コンストラクターが完了していると仮定すると、オブジェクトのメンバーにアクセスできますか?

次の例を検討してください。

struct A
{
  enum status 
    { ERROR = -1, SUCCESS } state;
  A (int a) 
    : state(a > 0 ? SUCCESS : ERROR)
  {
    // do some stuff here
    // may change state
  }
};

int main (void)
{
  // Is this guaranteed to work?
  A::status S(A(5).state);
}

アクセスしたらすぐに A のコンストラクターを実行する必要がありますstateか?

4

1 に答える 1

4

Aはい、標準では、にアクセスする前に、 のコンストラクターのすべての計算と副作用を実行する実装が必要stateです。


参照:

この式X(Y).Zは、C++11 の 5.2.5/1 に準拠した Postfix 式です。

後置式の後にドットが続きます。または矢印 ->、オプションでキーワード テンプレート (14.2) が続き、その後に id-expression が続き、後置式です。

X(Y)は、同じ段落に従って評価されます。

ドットまたは矢印の前の接尾式が評価されます。64

64 :クラス メンバ アクセス式が評価される場合、たとえば id-expression が静的メンバを示す場合など、結果が後置式全体の値を決定するのに不要な場合でも、部分式の評価が行われます。

1.9/14 が適用される場所です。

完全な式に関連付けられたすべての値の計算と副作用は、評価される次の完全な式に関連付けられたすべての値の計算と副作用の前に並べられます。

X(Y)したがって、ドット演算子が評価されるとすぐに、 の計算と副作用が実行されます。

Xただし、この式は5.2.3/1 に従って完全に構築されたオブジェクトを生成します。

[...] 式は、発明された一時変数T(x1, x2, ...)の宣言と実質的に同等であり、結果はprvalue としての値です。T t(x1, x2, ...);tt

および 12.2/3:

実装が自明でないコンストラクター (12.1、12.8) を持つクラスの一時オブジェクトを導入する場合、一時オブジェクトに対してコンストラクターが呼び出されることを保証する必要があります。[...] 一時オブジェクトは、それらが作成されたポイントを (レキシカルに) 含む完全な式 (1.9) を評価する最後のステップとして破棄されます。

標準では、一時オブジェクトの実際の作成が実行されていない場合でも、プログラムがそのように動作する必要があります (12.2/1)。

一時オブジェクトの作成が評価されない場合 (第 5 節) または回避される場合 (12.8) であっても、一時オブジェクトが作成され、後で破棄されたかのように、すべての意味制限が尊重されます。

于 2014-02-04T14:00:37.793 に答える