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 .