2011-01-18 17 views
7

Niedawno natknąłem się na tę konstrukcję: int (m); co wydaje się być równoważne z: int m;Składnia o zmiennej decyzyjności C++

Dziwnie, nigdy wcześniej nie widziałem tego konkretnego języka. Czy ktoś może wskazać mi punkt odniesienia, w którym mogę przeczytać specyfikację, lub po prostu wyjaśnić bezpośrednio? Czy to też działa w prostym C?

Dzięki, ConfusedDeveloper

+3

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;'. –

Odpowiedz

11

To nie jest "idiom". Jest to po prostu nadmiarowa para nawiasów. Gramatycznie, mogą tam być, ale nie służą niczemu.

Czasami podobne nawiasy pozornie zbędne mogą być wykorzystane do rozwiązywania niejasności w C++ deklaracji, jak

int a(int()); 

który deklaruje funkcję można przekształcić

int a((int())); 

co odpowiada

int a = int(); 

i definiuje zmienną. Ale nie jest to dokładnie to, co masz w swoim przypadku.

+2

Drobna nitpick: nie zawsze jest zbędna. Na przykład możesz napisać 'cout << int (n)', ale nie 'cout << int n'. – suszterpatt

+0

Dzięki, to jest pomocne. BTW, definicja idiomu: wyrażenie usankcjonowane przez użycie specyficzne dla danego języka. Wydaje się odpowiedni opis. – ConfusedDeveloper

+7

@sterterpatt: Pytanie dotyczyło konkretnie deklaracji. Twój przykład nie zawiera żadnych deklaracji. Twój przykład dotyczy wyrażenia '()' w wyrażeniach, co jest zupełnie inną historią. – AnT

1

Jest również używany do rzucania. Podobnie jak,

double m= 10.0; 
int n= int(m); 
+0

Pytanie dotyczy deklaracji, a to wcale nie jest deklaracja, tylko coś, co wygląda podobnie. – aschepler

+2

@aschepler: Tak. Ponieważ wygląda podobnie, dlatego go publikuję. Chciałem mu tylko powiedzieć, że tak też jest. :-) – Nawaz

1

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.