นี่คือโค้ด C ++
ในตัวอย่างนี้บล็อคโค้ดจำนวนมากมีลักษณะเหมือนการเรียกคอนสตรัคเตอร์ น่าเสียดายที่รหัสบล็อก # 3 ไม่ใช่ (คุณสามารถตรวจสอบได้โดยใช้https://godbolt.org/z/q3rsxnและhttps://cppinsights.io )
ฉันคิดว่ามันเป็นสัญกรณ์ C ++ เก่าและสามารถอธิบายการแนะนำของสัญกรณ์การก่อสร้าง C ++ 11 ใหม่โดยใช้ {} (cf # 4)
คุณมีคำอธิบายสำหรับT(i)
ความหมายใกล้กับสัญกรณ์คอนสตรัคชัน แต่แตกต่างกันอย่างแน่นอน?
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: ดังนั้นT(i)
(# 3) เทียบเท่ากับT i = T()
;
-Wall
และคุณจะได้รับ " warning: parentheses were disambiguated as redundant parentheses around declaration of variable named 'i' [-Wvexing-parse]
" จากเสียงดังกราวหรือเล็กน้อยมีแรงจูงใจน้อย " warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
" จาก GCC
T t()
) แต่ไม่ใช่สำหรับการประกาศอย่างง่าย เพื่อตรวจสอบว่านี้อาจจะรบกวน