Di sini sepotong kode C ++.
Dalam contoh ini, banyak blok kode terlihat seperti panggilan konstruktor. Sayangnya, kode blok 3 tidak (Anda dapat memeriksanya menggunakan https://godbolt.org/z/q3rsxn dan https://cppinsights.io ).
Saya pikir, ini adalah notasi C ++ lama dan bisa menjelaskan pengenalan notasi konstruksi C ++ 11 baru menggunakan {} (cf # 4).
Apakah Anda memiliki penjelasan untuk T(i)
makna, sangat dekat dengan notasi konstruktor, tetapi jelas sangat berbeda?
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: dengan demikian, T(i)
(# 3) setara dengan T i = T()
;
-Wall
dan Anda mendapat "warning: parentheses were disambiguated as redundant parentheses around declaration of variable named 'i' [-Wvexing-parse]
" dari dentang, atau "warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
" yang sedikit kurang termotivasi dari gcc .T t()
) tetapi tidak untuk ekspresi deklarasi yang begitu sederhana. Yang pasti, ini bisa menjengkelkan .Jawaban:
Pernyataan:
setara dengan:
Dengan kata lain, itu mendeklarasikan variabel bernama
i
dengan tipeT
. Ini karena tanda kurung diperbolehkan dalam deklarasi di beberapa tempat (untuk mengubah pengikatan deklarator) dan karena pernyataan ini dapat diuraikan sebagai deklarasi, itu adalah deklarasi (meskipun mungkin lebih masuk akal sebagai ekspresi).sumber
int(i)
juga menyatakanint
namai
?Anda dapat menggunakan Compiler Explorer untuk melihat apa yang terjadi di assembler.
Anda dapat melihat bahwa # 1, # 2 # 4 dan # 5 melakukan hal yang sama tetapi anehnya # 3 memanggil konstruktor lain (konstruktor objek dasar).
Adakah yang punya penjelasan?
Kode assembler:
sumber