C ++ 17 [[nodiscard]]
, programlayıcıların, işlevini, geri döndürülen nesne bir arayan tarafından atılırsa, derleyicinin bir uyarı üretecek şekilde işaretlemesini sağlayan bir özellik sunar; Aynı özellik tüm sınıf tipine eklenebilir.
Özgün teklifte bu özelliğin motivasyonunu okudum ve C ++ 20'nin std::vector::empty
, isimlerinin dönüş değeriyle ilgili kesin bir anlam ifade etmeyen, standart fonksiyonlara nitelik katacağını biliyorum .
Serin ve kullanışlı bir özellik. Aslında, neredeyse çok kullanışlı görünüyor . Hakkında okuduğum her yerde [[nodiscard]]
, insanlar bunu seçmiş olduğunuz birkaç işlev veya türe ekler gibi dinler ve gerisini unuturlar. Peki neden okunamaz bir değer, özellikle de yeni kod yazarken özel bir durum olsun? Atılan bir iade değeri tipik olarak bir hata veya en azından bir kaynak israfı değil midir?
Ve C ++ 'ın tasarım ilkelerinden biri, derleyicinin olabildiğince fazla hata alması gerektiği anlamına gelmiyor mu?
Öyleyse, neden [[nodiscard]]
hemen hemen her void
işlev türü olmayan ve neredeyse her sınıf türüne kendi eski, eski kodunuzu eklemiyorsunuz ?
Bunu kendi kodumla yapmaya çalıştım ve gayet iyi çalışıyor, ancak Java gibi hissetmeye başladığı kadar çok ayrıntılı. Derleyicileri , niyetinizi belirlediğiniz diğer birkaç durum dışında , varsayılan olarak atılan geri dönüş değerleri hakkında uyarmak çok daha doğal görünecektir [*] .
Standart tekliflerde, blog girişlerinde, Yığın Taşması sorularında veya internette başka bir yerde bu olasılık hakkında hiç tartışma görmedim, bir şey eksik olmalı.
Neden böyle bir tamirci yeni C ++ kodunda anlam ifade etmiyor? Ayrıntı [[nodiscard]]
hemen hemen her yerde kullanmamak için tek neden midir?
[*] Teoride, standart kütüphane uygulamalarında olduğu [[maydiscard]]
gibi fonksiyonlara da geriye dönük olarak eklenebilecek bir nitelik gibi bir şey olabilir printf
.
const
(daha doğrusu "düz eski veri nesnesi" veya) bir başka "basit" sınıfı kabartmak yapabilirsiniz ölçüde C ++.
std::vector
veya kütüphane gibi standart kütüphane sınıflarıyla daha ilgilidir std::unique_ptr
. Her iki dilde de çalıştım; Java fahişe bir dildir, ancak daha ayrıntılıdır.
operator =
Örneğin. Vestd::map::insert
.