Na przykład oświadczenie takie jak:Dlaczego C++ pozwala na otaczanie nazwy zmiennej w nawiasach podczas deklarowania zmiennej?
int (x) = 0;
Albo nawet, że:
int (((x))) = 0;
natknąłem się na to, ponieważ w moim kodu zdarzyło mi się mieć fragment podobny do następującego:
struct B
{
};
struct C
{
C (B *) {}
void f() {};
};
int main()
{
B *y;
C (y);
}
Oczywiście chciałem zbudować obiekt o nazwie C
, który następnie zrobiłby coś użytecznego w jego destruktorze. Jednak, jak to się dzieje, kompilator traktuje C (y);
jako deklarację zmiennej y
z typem C
iw ten sposób drukuje błąd związany z redefinicją y
. Interesujące jest to, że jeśli napiszę to jako C (y).f()
lub jako coś takiego jak C (static_cast<B*> (y))
, to skompiluje się zgodnie z przeznaczeniem. Najlepsze nowoczesne obejście to oczywiście użycie polecenia {}
w wywołaniu konstruktora.
Jak już się zorientowałem, można zadeklarować zmienne takie jak int (x) = 0;
lub nawet int (((x))) = 0;
, ale nigdy nie widziałem nikogo, kto faktycznie używa takich deklaracji. Więc jestem zainteresowany - jaki jest cel takiej możliwości, ponieważ na razie widzę, że tworzy ona tylko przypadek podobny do osławionej "najbardziej irytującej analizy" i nie dodaje niczego użytecznego?
"Celem" możliwości jest prawdopodobnie uproszczenie parsera. – molbdnilo
możliwy duplikat [Jaki jest cel deklaracji takiej jak int (x); lub int (x) = 10;] (http://stackoverflow.com/questions/26832321/what-is-the- purpose-of-a-declaration-like-int-x-or-int-x-10) – GSerg
@GSerg Funny, jak tekst mojego pytania odpowiada na pytanie z drugiej odpowiedzi w połączonym pytaniu, ponieważ podam przykład, w którym zezwalanie na takie oświadczenia prowadzi do nieoczekiwanych rezultatów :) – Predelnik