มีบางกรณีที่คุณต้องใช้ประเภทผลตอบแทนต่อท้าย โดยเฉพาะอย่างยิ่งประเภทการส่งคืนแลมบ์ดาหากระบุไว้จะต้องถูกระบุผ่านประเภทผลตอบแทนต่อท้าย นอกจากนี้หากประเภทการส่งคืนของคุณใช้ a decltype
ที่กำหนดให้ชื่ออาร์กิวเมนต์อยู่ในขอบเขตจะต้องใช้ประเภทการส่งคืนต่อท้าย (อย่างไรก็ตามโดยปกติแล้วสามารถใช้declval<T>
เพื่อแก้ไขปัญหาหลังนี้ได้)
ประเภทผลตอบแทนต่อท้ายมีข้อดีเล็กน้อยอื่น ๆ ตัวอย่างเช่นพิจารณานิยามฟังก์ชันสมาชิกที่ไม่ใช่อินไลน์โดยใช้ไวยากรณ์ของฟังก์ชันดั้งเดิม:
struct my_awesome_type
{
typedef std::vector<int> integer_sequence;
integer_sequence get_integers() const;
};
my_awesome_type::integer_sequence my_awesome_type::get_integers() const
{
}
สมาชิกประเภทไม่อยู่ในขอบเขตจนกว่าชื่อของคลาสจะปรากฏขึ้นก่อนหน้า::get_integers
นี้ดังนั้นเราจึงต้องทำซ้ำคุณสมบัติของคลาสสองครั้ง หากเราใช้ประเภทผลตอบแทนต่อท้ายเราไม่จำเป็นต้องตั้งชื่อประเภทซ้ำ:
auto my_awesome_type::get_integers() const -> integer_sequence
{
}
ในตัวอย่างนี้ไม่ใช่เรื่องใหญ่ แต่ถ้าคุณมีชื่อคลาสแบบยาวหรือฟังก์ชันสมาชิกของเทมเพลตคลาสที่ไม่ได้กำหนดแบบอินไลน์ก็สามารถสร้างความแตกต่างอย่างมากในการอ่านได้
ในเซสชัน"Fresh Paint"ที่ C ++ Now 2012 Alisdair Meredith ได้ชี้ให้เห็นว่าหากคุณใช้ประเภทการส่งคืนต่อท้ายอย่างสม่ำเสมอชื่อของฟังก์ชันทั้งหมดของคุณจะเรียงลำดับอย่างเรียบร้อย:
auto foo() -> int;
auto bar() -> really_long_typedef_name;
ผมเคยใช้ต่อท้ายประเภทผลตอบแทนทุกที่ในCxxReflectดังนั้นหากคุณกำลังมองหาตัวอย่างของวิธีการรหัสรูปลักษณ์โดยใช้พวกเขาอย่างต่อเนื่องคุณสามารถดูมี (เช่นชั้น )type
decltype
โต้แย้ง