Ada kasus tertentu di mana Anda harus menggunakan jenis pengembalian jejak. Terutama, jenis pengembalian lambda, jika ditentukan, harus ditentukan melalui jenis pengembalian tambahan. Selain itu, jika tipe pengembalian Anda menggunakan decltype
yang mengharuskan nama argumen berada dalam cakupan, tipe pengembalian jejak harus digunakan (namun, biasanya dapat digunakan declval<T>
untuk mengatasi masalah yang terakhir ini).
Jenis trailing return memang memiliki beberapa keuntungan kecil lainnya. Misalnya, pertimbangkan definisi fungsi anggota non-inline menggunakan sintaks fungsi tradisional:
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
{
}
Anggota typedefs tidak berada dalam lingkup sampai nama kelas muncul sebelumnya ::get_integers
, jadi kita harus mengulang kualifikasi kelas dua kali. Jika kita menggunakan tipe pengembalian jejak, kita tidak perlu mengulangi nama tipe:
auto my_awesome_type::get_integers() const -> integer_sequence
{
}
Dalam contoh ini, ini bukan masalah besar, tetapi jika Anda memiliki nama kelas yang panjang atau fungsi anggota template kelas yang tidak ditentukan secara inline, hal ini dapat membuat perbedaan besar dalam keterbacaan.
Dalam sesi "Fresh Paint" di C ++ Now 2012, Alisdair Meredith menunjukkan bahwa jika Anda menggunakan tipe pengembalian trailing secara konsisten, nama semua fungsi Anda berbaris rapi:
auto foo() -> int;
auto bar() -> really_long_typedef_name;
Saya sudah digunakan mengikuti tipe kembali mana-mana di CxxReflect , jadi jika Anda sedang mencari contoh bagaimana kode terlihat menggunakan mereka secara konsisten, Anda dapat melihat ada (misalnya, yang type
kelas ).
decltype
argumen.