ใน C ++ 11 มีไวยากรณ์สองแบบสำหรับการประกาศฟังก์ชัน:
return-type identifier ( การประกาศอาร์กิวเมนต์ ... )
และ
auto ตัวระบุ ( การประกาศอาร์กิวเมนต์ ... ) -> return_type
พวกเขาเทียบเท่า ตอนนี้เมื่อเทียบเท่าแล้วทำไมคุณถึงต้องการใช้แบบหลัง? C ++ 11 แนะนำdecltypeสิ่งที่ยอดเยี่ยมนี้ซึ่งช่วยให้คุณสามารถอธิบายประเภทของนิพจน์ได้ ดังนั้นคุณอาจต้องการรับประเภทผลตอบแทนจากประเภทอาร์กิวเมนต์ ดังนั้นคุณลอง:
template <typename T1, typename T2>
decltype(a + b) compose(T1 a, T2 b);
และคอมไพเลอร์จะบอกคุณว่ามันไม่รู้aและbอยู่ในdecltypeอาร์กิวเมนต์ นั่นเป็นเพราะพวกเขาประกาศโดยรายการอาร์กิวเมนต์เท่านั้น
คุณสามารถแก้ไขปัญหาได้อย่างง่ายดายโดยใช้declvalและพารามิเตอร์เทมเพลตที่ประกาศไว้แล้ว ชอบ:
template <typename T1, typename T2>
decltype(std::declval<T1>() + std::declval<T2>())
compose(T1 a, T2 b);
ยกเว้นตอนนี้มันดูละเอียดขึ้นจริงๆ ดังนั้นจึงมีการเสนอและใช้ไวยากรณ์การประกาศทางเลือกและตอนนี้คุณสามารถเขียนได้แล้ว
template <typename T1, typename T2>
auto compose(T1 a, T2 b) -> decltype(a + b);
และมันละเอียดน้อยลงและกฎการกำหนดขอบเขตก็ไม่จำเป็นต้องเปลี่ยนแปลง
การอัปเดต C ++ 14: C ++ 14 อนุญาตเพียงแค่
auto การประกาศอาร์กิวเมนต์ตัวระบุ( ... )
ตราบเท่าที่ฟังก์ชั่นถูกกำหนดไว้อย่างสมบูรณ์ก่อนการใช้งานและreturnคำสั่งทั้งหมดอนุมานเป็นประเภทเดียวกัน ->ไวยากรณ์ยังคงมีประโยชน์สำหรับฟังก์ชั่นของประชาชน (ประกาศในส่วนหัว) ถ้าคุณต้องการที่จะซ่อนร่างกายในแฟ้มแหล่งที่มา เห็นได้ชัดว่าไม่สามารถทำได้ด้วยเทมเพลต แต่มีบางประเภทที่เป็นรูปธรรม (โดยปกติจะได้มาจากการเขียนโปรแกรมแม่แบบ) ที่ยากที่จะเขียนเป็นอย่างอื่น