Aqui está um pedaço de código C ++.
Neste exemplo, muitos blocos de código parecem chamadas de construtor. Infelizmente, o código de bloco nº 3 não é (você pode verificá-lo usando https://godbolt.org/z/q3rsxn e https://cppinsights.io ).
Eu acho que é uma notação antiga do C ++ e poderia explicar a introdução da nova notação de construção do C ++ 11 usando {} (cf # 4).
Você tem uma explicação para o T(i)
significado, tão próxima de uma notação de construtor, mas definitivamente tão 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: assim, T(i)
(# 3) é equivalente a T i = T()
;
-Wall
e você recebe "warning: parentheses were disambiguated as redundant parentheses around declaration of variable named 'i' [-Wvexing-parse]
"do clang, ou o"warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
" menos motivado" " do gcc .T t()
), mas não para expressões de declaração tão simples. Com certeza, isso pode ser irritante .Respostas:
A declaração:
é equivalente a:
Em outras palavras, ele declara uma variável nomeada
i
com typeT
. Isso ocorre porque parênteses são permitidos nas declarações em alguns lugares (para alterar a ligação dos declaradores) e, como essa declaração pode ser analisada como uma declaração, é uma declaração (mesmo que faça mais sentido como expressão).fonte
int(i)
também declara umint
nomei
?Você pode usar o Compiler Explorer para ver o que acontece no assembler.
Você pode ver que os números 1, 2 e 4 fazem a mesma coisa, mas estranhamente o número 3 chama o outro construtor (o construtor do objeto base).
Alguém tem uma explicação?
Código do montador:
fonte