2011-04-13 15 views
6

Son zamanlarda bu gibi kod üzerinde tökezledi:Derleyici, const_cast semantiklerini c stili kalıplarda devre dışı bırakmak için geçiş yapar mı?

void foo(const Bar* b) { 
    ... 
    takes_nonconst_param_fn((Bar*)b); 
    ... 

Açıkçası, geliştirici ne yaptığını bilmiyordu, ama derleyici olsaydı sessizce c-style-döküm kabul ve en azından gerekli Uygun bir const_cast, bunu yapmadan önce iki kez yapmış olabilir.

Yani bu bana herhangi bir modern derleyiciler c-style-atmalarını için const_cast anlambilimini önlemek için bir geçiş var mı, düşünme var?

O c-style-atmalarını tüm oluşumlarını engellemek için basitçe pratik değil ve izin gerekli bir kötülük var onların static_ ve reinterpret_ semantik (eğer yalnızca bazı kütüphane kodu için), ancak benim izlenimim, c- o meşru kullanımıdır constness uzağa atmak stil yayınları belki tamamen devre dışı bırakmak için mümkün olmalıdır, C++ kod üsleri nadirdir?

+0

herhangi bir fark yaratır mı? – James

+2

@James: Neden açık yayınların nasıl çalıştığını etkilemesini bekliyorsunuz? Eğer foo 'bir üye fonksiyon ise, o zaman nesne üyeleri 'const' fonksiyon içinde olur; değilse, o zaman bu bir hata olur. –

+1

Aslında, hepsinden 'static_cast' formunu devre dışı bırakabilirdim. –

cevap

7

GCC C tarzı dökme tip eleme kaldırdığında uyarmak için seçeneği -Wcast-qual sahiptir. -Werror ile birlikte, isterseniz tamamen önleyebilirsiniz. Eğer 'void foo (const Bar * b) const' olarak foo ilan etmeleri halinde

+4

Ayrıca tüm eski kadrolar için -Wold-style-cast düşünün. –

+0

Nice: Gerekli bayraklar listeme eklemem gereken başka bir bayrak. –

İlgili konular