คำตอบอื่น ๆ ที่กล่าวถึงข้อเสียเปรียบเช่น "คุณไม่รู้จริง ๆ ว่าประเภทของตัวแปรคืออะไร" ฉันจะบอกว่านี่เป็นส่วนใหญ่ที่เกี่ยวข้องกับการตั้งชื่อระเบียบเลอะเทอะในรหัส หากอินเทอร์เฟซของคุณมีชื่อชัดเจนคุณไม่จำเป็นต้องสนใจประเภทที่แน่นอน แน่นอนauto result = callSomeFunction(a, b);
ว่าไม่ได้บอกอะไรคุณมากนัก แต่auto valid = isValid(xmlFile, schema);
บอกให้คุณใช้มากพอvalid
โดยไม่ต้องสนใจว่ามันจะเป็นแบบไหน if (callSomeFunction(a, b))
ท้ายที่สุดด้วยเพียงแค่คุณจะไม่ทราบประเภททั้ง เช่นเดียวกันกับวัตถุชั่วคราว subexpression อื่น ๆ auto
ดังนั้นผมจึงไม่คิดว่านี่เป็นอุปสรรคที่แท้จริงของ
ฉันจะบอกว่าข้อเสียเปรียบหลักคือบางครั้งประเภทผลตอบแทนที่แน่นอนไม่ใช่สิ่งที่คุณต้องการทำงานด้วย ผลบางครั้งชนิดส่งคืนจริงแตกต่างจากประเภทส่งคืน "ตรรกะ" เป็นรายละเอียดการใช้งาน / การเพิ่มประสิทธิภาพ เทมเพลตนิพจน์เป็นตัวอย่างสำคัญ สมมติว่าเรามีสิ่งนี้:
SomeType operator* (const Matrix &lhs, const Vector &rhs);
เราคาดหวังว่าSomeType
จะมีเหตุผลVector
และเราต้องการที่จะปฏิบัติต่อสิ่งนี้ในรหัสของเรา อย่างไรก็ตามเป็นไปได้ว่าเพื่อวัตถุประสงค์ในการปรับให้เหมาะสมไลบรารีพีชคณิตที่เรากำลังใช้เทมเพลตนิพจน์ใช้และประเภทการคืนจริงคือ
MultExpression<Matrix, Vector> operator* (const Matrix &lhs, const Vector &rhs);
ตอนนี้ปัญหาคือว่าMultExpression<Matrix, Vector>
จะเก็บ a const Matrix&
และconst Vector&
ภายใน; มันคาดว่าจะแปลงเป็นVector
ก่อนสิ้นนิพจน์แบบเต็ม หากเรามีรหัสนี้ทุกอย่างดี:
extern Matrix a, b, c;
extern Vector v;
void compute()
{
Vector res = a * (b * (c * v));
// do something with res
}
อย่างไรก็ตามหากเราใช้auto
ที่นี่เราอาจมีปัญหา:
void compute()
{
auto res = a * (b * (c * v));
// Oops! Now `res` is referring to temporaries (such as (c * v)) which no longer exist
}