Oprócz innych odpowiedzi, czasami deklarator musi być nawiasowany.
Na przykład:
struct A {};
struct B { A a; };
namespace N {
struct B { int a; };
void f()
{
A (::B::*p) = &::B::a; // this() cannot be omitted
}
}
()
Jeżeli zostanie pominięty w powyższym kodzie, kompilator rozpoznaje kolejne zagnieżdżona nazwę specyfikatora A::B
zamiast A
i ::B
i wyda błąd.
Ten nawias jest konieczny, ale czasami prowadzi do sytuacji wprowadzającej w błąd.
struct A {
int m;
A() {}
A(int) {} // this isn't called
};
int i;
int main()
{
A(i); // this is a declaration
i.m = 1; // ok
}
W powyższym kodu A(i)
to zgłoszenie (a także określenie w tym przypadku) obiektu i
, zamiast ekspresji połączenia konstruktor z int
argumentu i
.
Mam nadzieję, że to pomoże.
Chociaż jest to całkowicie prawna składnia dla deklarowania liczby całkowitej, ze względu na innych programistów zmień ją na 'int m;'. –