Voici un morceau de code C ++.
Dans cet exemple, de nombreux blocs de code ressemblent à des appels de constructeur. Malheureusement, le code de blocage # 3 ne l'est pas (vous pouvez le vérifier en utilisant https://godbolt.org/z/q3rsxn et https://cppinsights.io ).
Je pense que c'est une ancienne notation C ++ et cela pourrait expliquer l'introduction de la nouvelle notation de construction C ++ 11 en utilisant {} (cf # 4).
Avez-vous une explication du T(i)
sens, si proche d'une notation constructeur, mais certainement si différente?
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: ainsi T(i)
(# 3) est équivalent à T i = T()
;
-Wall
et vous obtenez "warning: parentheses were disambiguated as redundant parentheses around declaration of variable named 'i' [-Wvexing-parse]
" de clang, ou le "moins motivéwarning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
" de gcc .T t()
) mais pas des expressions de déclaration si simples. Pour sûr, cela pourrait être vexant .Réponses:
La déclaration:
est équivalent à:
En d'autres termes, il déclare une variable nommée
i
avec typeT
. En effet, les parenthèses sont autorisées dans les déclarations à certains endroits (afin de modifier la liaison des déclarants) et puisque cette instruction peut être analysée comme une déclaration, il s'agit d'une déclaration (même si elle peut avoir plus de sens en tant qu'expression).la source
int(i)
déclare également unint
nomméi
?Vous pouvez utiliser l' Explorateur de compilateur pour voir ce qui se passe dans l'assembleur.
Vous pouvez voir que # 1, # 2 # 4 et # 5 font la même chose mais étrangement # 3 appelle l'autre constructeur (le constructeur de l'objet de base).
Est-ce que quelqu'un a une explication?
Code assembleur:
la source