Je suis récemment tombé sur cette construction: int (m); ce qui semble être équivalent à: int m;
Bizarrement, je n’ai jamais vu cet idiome particulier auparavant. Quelqu’un peut-il m’indiquer une référence où je peux lire la spécification à ce sujet ou simplement expliquer directement? Est-ce que cela fonctionne aussi en C droit?
Merci, confusdeveloper
Ce n’est pas un “idiome”. C’est juste une paire de parenthèses redondante. Grammaticalement, ils peuvent être là, mais ils ne servent à rien.
Parfois, des parenthèses apparemment superflues peuvent être utilisées pour résoudre les ambiguïtés des déclarations C ++, comme
int a(int());
qui déclare une fonction peut être transformé en
int a((int()));
ce qui équivaut à
int a = int();
et définit une variable. Mais ce n’est pas exactement ce que vous avez dans votre cas.
C’est aussi utilisé pour le casting. Comme,
double m= 10.0; int n= int(m);
En plus d’autres réponses, le déclarant doit parfois être mis entre parenthèses.
Par exemple:
struct A {}; struct B { A a; }; namespace N { struct B { int a; }; void f() { A (::B::*p) = &::B::a; // this () cannot be omitted } }
Si ()
est omis dans le code ci-dessus, le compilateur reconnaît un spécificateur de nom nested consécutif A::B
au lieu de A
et ::B
et émettra une erreur.
Cette parenthèse est nécessaire mais conduit parfois à une situation trompeuse.
struct A { int m; A() {} A( int ) {} // this isn't called }; int i; int main() { A(i); // this is a declaration im = 1; // ok }
Dans le code ci-dessus, A(i)
est une déclaration (et également une définition dans ce cas) d’un object i
, au lieu d’une expression d’appel de constructeur avec un argument int
, i
.
J’espère que cela t’aides.