В дополнение к другим ответам иногда декларатор должен быть заключен в скобки.
Например:
struct A {};
struct B { A a; };
namespace N {
struct B { int a; };
void f()
{
A (::B::*p) = &::B::a; // this () cannot be omitted
}
}
Если ()
опущен в вышеприведенном коде, компилятор распознает последовательный вложенный спецификатор имени A::B
вместо A
и ::B
и выдаст ошибку.
Эта скобка необходима, но иногда приводит к вводящей в заблуждение ситуации.
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
}
В приведенном выше коде A(i)
является объявлением (и в данном случае также определением) объекта i
вместо выражения вызова конструктора с аргументом int
i
.
Надеюсь, это поможет.