C ++ 17 memperkenalkan [[nodiscard]]
atribut, yang memungkinkan pemrogram menandai fungsi dengan cara yang dikompilasi oleh kompiler jika objek yang dikembalikan dibuang oleh penelepon; atribut yang sama dapat ditambahkan ke seluruh tipe kelas.
Saya telah membaca tentang motivasi untuk fitur ini dalam proposal asli , dan saya tahu bahwa C ++ 20 akan menambahkan atribut ke fungsi standar seperti std::vector::empty
, yang namanya tidak menyampaikan makna yang jelas mengenai nilai pengembalian.
Ini fitur keren dan bermanfaat. Nyatanya, itu sepertinya terlalu berguna. Di mana-mana saya baca [[nodiscard]]
, orang-orang mendiskusikannya seolah-olah Anda hanya akan menambahkannya ke beberapa fungsi atau tipe tertentu dan melupakan sisanya. Tetapi mengapa nilai yang tidak bisa dibuang menjadi kasus khusus, terutama ketika menulis kode baru? Bukankah nilai pengembalian yang dibuang biasanya berupa bug atau setidaknya pemborosan sumber daya?
Dan bukankah salah satu prinsip desain C ++ itu sendiri bahwa kompiler harus menangkap kesalahan sebanyak mungkin?
Jika demikian, mengapa tidak menambahkan [[nodiscard]]
kode non-legacy Anda sendiri ke hampir setiap non- void
fungsi dan hampir setiap jenis kelas tunggal?
Saya sudah mencoba melakukan itu dalam kode saya sendiri, dan itu berfungsi dengan baik, kecuali sangat verbose yang mulai terasa seperti Jawa. Tampaknya jauh lebih alami untuk membuat kompiler memperingatkan tentang nilai pengembalian yang dibuang secara default kecuali untuk beberapa kasus lain di mana Anda menandai niat Anda [*] .
Karena saya telah melihat nol diskusi tentang kemungkinan ini dalam proposal standar, entri blog, pertanyaan Stack Overflow atau di mana pun di internet, saya pasti kehilangan sesuatu.
Mengapa mekanisme seperti itu tidak masuk akal dalam kode C ++ baru? Apakah verbositas satu-satunya alasan untuk tidak menggunakan [[nodiscard]]
hampir di semua tempat?
[*] Secara teori, Anda mungkin memiliki sesuatu seperti [[maydiscard]]
atribut, yang juga dapat ditambahkan secara surut ke fungsi seperti printf
dalam implementasi perpustakaan standar.
const
bisa mengasapi sebaliknya "sederhana" kelas (atau lebih tepatnya "biasa lama objek data") jauh di C ++.
std::vector
atau std::unique_ptr
, di mana Anda hanya perlu anggota data dalam definisi kelas Anda. Saya telah bekerja dengan kedua bahasa; Java adalah bahasa yang oke, tetapi lebih verbose.
operator =
sebagai contoh. Danstd::map::insert
.