最小限のコード:
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;
ます。コンストラクターが呼び出されない関連ステートメントにも
同じことが当てはまります。ここにデモがあります。foo
A::A(int=0)
質問:
- (2) と (4) も宣言として扱われるのはなぜですか?
foo
ステートメント (3) および (4)の記述は何ですか?