Aquí una pieza de código C ++.
En este ejemplo, muchos bloques de código parecen llamadas de constructor. Desafortunadamente, el código de bloqueo n. ° 3 no lo es (puede verificarlo usando https://godbolt.org/z/q3rsxn y https://cppinsights.io ).
Creo que es una notación antigua de C ++ y podría explicar la introducción de la nueva notación de construcción C ++ 11 usando {} (cf # 4).
¿Tiene una explicación para el T(i)
significado, tan cerca de una notación de constructor, pero definitivamente tan diferente?
struct T {
T() { }
T(int i) { }
};
int main() {
int i = 42;
{ // #1
T t(i); // new T named t using int ctor
}
{ // #2
T t = T(i); // new T named t using int ctor
}
{ // #3
T(i); // new T named i using default ctor
}
{ // #4
T{i}; // new T using int ctor (unnamed result)
}
{ // #5
T(2); // new T using int ctor (unnamed result)
}
}
NB: por lo tanto, T(i)
(# 3) es equivalente a T i = T()
;
-Wall
y obtenga "warning: parentheses were disambiguated as redundant parentheses around declaration of variable named 'i' [-Wvexing-parse]
" de clang, o "warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
" un poco menos motivado " de gcc .T t()
), pero no de expresiones de declaración tan simples. Por supuesto, esto podría ser irritante .Respuestas:
La declaración:
es equivalente a:
En otras palabras, declara una variable denominada
i
con tipoT
. Esto se debe a que los paréntesis están permitidos en las declaraciones en algunos lugares (para cambiar el enlace de los declaradores) y dado que esta declaración se puede analizar como una declaración, es una declaración (aunque podría tener más sentido como expresión).fuente
int(i)
también se declara unint
nombrei
?Puede usar Compiler Explorer para ver qué sucede en el ensamblador.
Puede ver que # 1, # 2 # 4 y # 5 hacen lo mismo pero estranguladamente # 3 llaman al otro constructor (el constructor de objetos base).
¿Alguien tiene una explicación?
Código de ensamblador:
fuente