Di pustaka rentang ada dua jenis operasi:
- pandangan yang malas dan membutuhkan wadah yang mendasarinya ada.
- tindakan yang bersemangat, dan menghasilkan wadah baru sebagai hasilnya (atau memodifikasi yang sudah ada)
Tampilannya ringan. Anda memberikan nilai dan mengharuskan wadah yang mendasarinya tetap valid dan tidak berubah.
Dari dokumentasi rentang-v3
Tampilan adalah pembungkus ringan yang menyajikan tampilan urutan elemen yang mendasari dalam beberapa cara kustom tanpa bermutasi atau menyalinnya. Tampilan murah untuk dibuat dan disalin dan memiliki semantik referensi yang tidak memiliki.
dan:
Setiap operasi pada rentang yang mendasari yang membatalkan iterator atau sentinelnya juga akan membatalkan pandangan yang mengacu pada bagian mana pun dari rentang itu.
Penghancuran wadah yang mendasari jelas membatalkan semua iterator untuk itu.
Dalam kode Anda, Anda secara spesifik menggunakan tampilan - Anda menggunakan ranges::views::transform
. Pipa itu hanyalah gula sintaksis untuk membuatnya mudah ditulis seperti apa adanya. Anda harus melihat hal terakhir dalam pipa untuk melihat apa yang Anda hasilkan - dalam kasus Anda, ini adalah pemandangan.
Jika tidak ada operator pipa, mungkin akan terlihat seperti ini:
ranges::views::transform(my_custom_rng_gen(some_param), my_transform_op)
jika ada beberapa transformasi yang terhubung dengan cara itu Anda bisa melihat bagaimana jeleknya itu akan terjadi.
Jadi, jika my_custom_rng_gen
menghasilkan semacam wadah, yang Anda ubah dan kemudian kembali, wadah itu akan hancur dan Anda memiliki referensi yang menggantung dari pandangan Anda. Jika my_custom_rng_gen
ada pandangan lain terhadap sebuah wadah yang hidup di luar lingkup ini, semuanya baik-baik saja.
Namun, kompiler harus dapat mengenali bahwa Anda menerapkan tampilan pada wadah sementara dan memukul Anda dengan kesalahan kompilasi.
Jika Anda ingin fungsi Anda mengembalikan rentang sebagai wadah, Anda harus secara eksplisit "mematerialisasikan" hasilnya. Untuk itu, gunakan ranges::to
operator dalam fungsi.
Pembaruan: Untuk lebih tegas tentang komentar Anda "di mana dokumentasi mengatakan bahwa penyusunan rentang / perpipaan membutuhkan dan menyimpan tampilan?"
Pipa hanyalah gula sintaksis untuk menghubungkan berbagai hal dalam ekspresi yang mudah dibaca. Bergantung pada bagaimana digunakan, itu mungkin atau tidak dapat mengembalikan tampilan. Itu tergantung pada argumen sisi kanan. Dalam kasus Anda itu adalah:
`<some range> | ranges::views::transform(...)`
Jadi ekspresi mengembalikan apa pun yang views::transform
dikembalikan.
Sekarang, dengan membaca dokumentasi transformasi:
Di bawah ini adalah daftar combinator rentang malas, atau pandangan, yang menyediakan Range-v3, dan uraian singkat tentang bagaimana masing-masing dimaksudkan untuk digunakan.
[...]
views::transform
Dengan rentang sumber dan fungsi unary, kembalikan rentang baru di mana setiap elemen hasil adalah hasil penerapan fungsi unary ke elemen sumber.
Jadi ia mengembalikan suatu jangkauan, tetapi karena ia adalah operator yang malas, maka jangkauan yang dikembalikannya adalah sebuah tampilan, dengan semua semantiknya.