4

最小限のコード:

struct A {
  A(int = 0) {}
};

int i = 0, *p = &i;
int* foo () { return p; }

int main () {
  A(); // calls `A::A(int=0)`
  A(i);  // calls `A::A(int=0)`

  A(*p); // <--- (1) same as local `A *p;`
  {
    A((*p));   // <--- (2) same as local `A *p;`
  }
  A (*foo());  // <--- (3) ??
  {
    A ((*foo()));  // <--- (4) ??
  }
}

少なくともA((*p))が呼び出されることを期待していましたA::A(int=0)。複数の中括弧を入れても*p、ステートメントを として扱いA *p;ます。コンストラクターが呼び出されない関連ステートメントにも
同じことが当てはまります。ここにデモがあります。fooA::A(int=0)

質問:

  1. (2) と (4) も宣言として扱われるのはなぜですか?
  2. fooステートメント (3) および (4)の記述は何ですか?
4

2 に答える 2