แรงจูงใจและข้อผิดพลาด (?) ของคำหลักอัตโนมัติใน C ++ 11


20

ฉันเพิ่งสงสัยว่าทำไมคำหลักที่autoถูกเลือกใน C ++ 11 เพื่อทำเครื่องหมายตัวแปรที่ต้องสรุปประเภทของคอมไพเลอร์เช่น

auto x = 1;

ตั้งแต่

  1. var ดูเหมือนจะพบได้ทั่วไปในภาษาการเขียนโปรแกรมอื่น ๆ (เช่น C #, Scala, JavaScript) และ
  2. เท่าที่ฉันเข้าใจความหมายใหม่ของการautoแบ่งความเข้ากันได้แบบย้อนหลัง (ไม่ค่อยได้ใช้ แต่มีความหมายแตกต่างกันในการแก้ไข C ++ ก่อนหน้าดูตัวอย่างที่นี่ )

ฉันต้องการถามว่ามีเหตุผลพิเศษในการเลือกauto(เพื่อประโยชน์ของvarคำหลักอื่นหรือไม่) มีการอภิปรายเฉพาะเกี่ยวกับปัญหานี้ก่อนปล่อยมาตรฐาน C ++ 11 หรือไม่

นอกจากนี้ยังมีความเข้ากันไม่ได้ที่เราควรระวังเมื่อทำการคอมไพล์รหัส C ++ ใหม่ด้วยคอมไพเลอร์ C ++ 11 หรือไม่?


9
ซีแมนทิกส์ใหม่ของautoอาจแบ่งความเข้ากันได้ย้อนหลัง แต่ขึ้นอยู่กับความถี่ที่varใช้เป็นชื่อตัวแปรเมื่อเทียบกับความถี่ที่ใช้autoคำหลักในโค้ด pre-11 คณะกรรมการอาจมีความเห็นว่ามันเข้ากันได้น้อยกว่าการแนะนำใหม่ คำหลักจะ
sepp2k

2
"เนื่องจากปัจจุบันนี้คำถามนี้ไม่เหมาะกับรูปแบบคำถามและคำตอบของเราเราคาดว่าคำตอบจะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญเฉพาะด้าน คุณรู้สึกว่าคำถามนี้สามารถปรับปรุงและเปิดใหม่ดูคำถามที่พบบ่อยสำหรับคำแนะนำ ": คำถามนี้ถามเกี่ยวกับข้อเท็จจริง: มีการอภิปรายเกี่ยวกับหัวข้อนี้ มีสองคำตอบที่เป็นไปได้: ใช่และไม่ใช่
Giorgio

2
แน่นอนว่ามีการพูดคุยกันซึ่งทำให้คำถามไม่มีประโยชน์ในเรื่องนั้น autoVS varคำถามคือสิ่งที่ 90% ของข้อความของคุณหมายถึงและคำถามที่ไม่มีผลที่ชัดเจน (แม้ว่าฉันไม่ใช่คนที่ลงคะแนนให้ปิด)
Telastyn

1
@Telastyn: ถ้าฉันรู้ว่ามีการอภิปรายในหัวข้อนี้ฉันจะไม่ถาม Googling สำหรับ "auto กับ var C ++" หรือ "auto C ++" ไม่ได้แสดงอะไรเลยในหัวข้อนี้
Giorgio

1
autoถูกเสนอสำหรับ C ++ ก่อนที่จะvarถูกนำมาใช้ใน C # ดังนั้นคำถามที่ควรจะเป็นเหตุผลที่ C # ไม่ใช้อัตโนมัติ var มีความหมายแตกต่างกันใน JavaScript และ Scala
adrianm

คำตอบ:


37

เกือบทุกคำที่คุณอาจคิดว่าการเพิ่มเป็นคำสำคัญให้กับภาษานั้นเกือบจะถูกนำมาใช้เป็นชื่อตัวแปรหรือบางส่วนของรหัสการทำงาน รหัสนี้จะเสียถ้าคุณทำให้คำนั้นเป็นคำสำคัญ

สิ่งที่โชคดีอย่างไม่น่าเชื่อautoคือมันเป็นคำหลักอยู่แล้วดังนั้นผู้คนจึงไม่มีตัวแปรที่มีชื่อนั้น แต่ไม่มีใครใช้เพราะเป็นค่าเริ่มต้น ทำไมต้องพิมพ์:

auto int i=0;

เมื่อ

int i=0;

หมายถึงสิ่งเดียวกันหรือไม่

ฉันคิดว่าอยู่ที่ไหนสักแห่งบนโลกนี้มีรหัสจำนวนเล็กน้อยที่ใช้ 'อัตโนมัติ' แบบเก่า แต่มันสามารถแก้ไขได้โดยการลบ 'อัตโนมัติ' และมันจะทำงานอีกครั้ง ดังนั้นจึงเป็นตัวเลือกที่ชัดเจนมากในการกำหนดคำหลักใหม่

ฉันก็คิดว่ามันเป็นความหมายที่ชัดเจนกว่า หากคุณได้ทำงานกับตัวแปรและเช่นเมื่อคุณเห็นvarคุณอาจคิดว่าการประกาศจะพิมพ์น้อยลงอย่างยิ่งกว่าถ้าคุณกดปุ่มทั้งหมดด้วยตัวคุณเองบนแป้นพิมพ์เพื่อระบุประเภทของตัวแปร สำหรับฉันautoทำให้ชัดเจนยิ่งขึ้นว่าคุณกำลังขอให้คอมไพเลอร์ทำการย่อประเภทโดยอัตโนมัติซึ่งมีความแข็งแกร่งเท่ากับที่คุณระบุไว้ ดังนั้นมันจึงเป็นช่วงเวลาที่โชคดีมากที่ได้มีชื่อที่ดีต่อคณะกรรมการ

เพื่อชี้แจงการแตกหัก (เล็ก):

ถ้าคุณมี

auto int i=0;

และพยายามคอมไพล์ด้วยคอมไพเลอร์ C ++ 11 ตอนนี้คุณจะได้รับข้อผิดพลาดเช่น

ข้อผิดพลาด C3530: 'อัตโนมัติ' ไม่สามารถรวมกับตัวระบุประเภทอื่น ๆ ได้

นี่เป็นเรื่องไม่สำคัญคุณเพียงลบ auto หรือ int และ recompile

มีปัญหาใหญ่กว่าคือว่า ถ้าคุณมี

auto i = 4.3;

C และ C ++ เก่าจริงๆจะทำให้(มันจะถ้าคุณซ้ายปิด- ประกาศเริ่มต้นเป็น) หากคุณใช้เวลานานมากโดยไม่ต้องคอมไพล์โค้ดนี้หรือใช้คอมไพเลอร์เก่าคุณอาจมีโค้ดนี้อย่างน้อยก็ในทางทฤษฎี C ++ 11 จะทำให้มันเป็นเพราะนั่นคือสิ่งที่ 4.3 (หรืออาจจะเป็นฉันยังอยู่ในโหมด Boxing Day แต่ประเด็นคือไม่ใช่.) สิ่งนี้อาจแนะนำข้อบกพร่องเล็กน้อยในแอปของคุณ และไม่มีคำเตือนหรือข้อผิดพลาดจากคอมไพเลอร์ ผู้คนในเรือลำนี้ควรค้นหาอย่างถี่ถ้วนเพื่อให้แน่ใจว่าพวกเขาไม่ได้ใช้วิธีแบบเดิมก่อนที่จะย้ายไปที่คอมไพเลอร์ C ++ 11 โชคดีที่รหัสดังกล่าวหายากมากiintautointdoublefloatintauto


ขอบคุณสำหรับคำตอบที่ชัดเจนมาก +1 ฉันเข้าใจถึงการแลกเปลี่ยนระหว่างความเข้ากันได้แบบย้อนกลับในแบบที่ไม่เป็นอันตรายและมีโอกาสขนาดใหญ่ที่รหัสเก่าจะไม่ถูกทำลายโดยคำหลักใหม่
Giorgio

จริงๆแล้วมีความไม่ลงรอยกันหรือไม่? คอมไพเลอร์ C ++ 11 จะไม่เพิกเฉยautoหากชื่อนั้นตามด้วยชื่อประเภทหรือไม่
aaaaaaaaaaaa

1
Visual C ++ 2012 พูดerror C3530: 'auto' cannot be combined with any other type-specifierกับบรรทัดนั้น
Kate Gregory

3
@KateGregory: ที่จริงแล้วไม่มีปัญหาauto i = 4.3;เพราะนั่นเป็นรูปแบบที่ไม่ดีใน C ++ 03 / C ++ 98 C ++ ไม่ได้ดำเนินการตามกฎ 'นัยโดยนัย' ที่ C89 มี (และลดลงในการแก้ไข C99)
Bart van Ingen Schenau

1
@Kate Gregory: หากคุณสามารถนำการสังเกตของ Bart มาพิจารณาและเปลี่ยนคำตอบของคุณตามนั้นฉันจะทำเครื่องหมายเป็นคำตอบที่ยอมรับ
Giorgio
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.