2015-10-22 11 views
8

işlevi denirC++ 'da boş gövdeli İfadeler: değerlendirilmek üzere bir garanti var mı?

if(doSomething()) {} 

mu 'C++ Standart' garantisi (Bir dipnot düşmek olarak benim tercih kodlama tarzı değil,) Bu ifadeyi göz önüne alındığında? (O dönüş değeri icra yolu üzerinde bir etkisi yoktur, bu yüzden derleyici kısayol değerlendirmenin fikirlerini takip etmek ve uzak optimize edebilir.)

+2

Evet, standart bunu garanti eder ve bir iyileştiricinin anlamsal etkiyi değiştirmesine izin verilmez. –

+0

Sadece dönüş değerini açıkça atmak istiyorsanız '(void) doSomething(); – Useless

cevap

8

dahil hiçbir kısa devre operatörü var, bu yüzden işlevi çağrılacak garantili yan etkileri kaldırmadan en uygun duruma getirilemezse. C++ 11 standart alıntı:

[...] uygun uygulamaları aşağıdaki açıklandığı gibi soyut makinesinin (yalnızca) gözlemlenebilir davranışı taklit etmek için gereklidir.

Bu hüküm bazen “olarak eğer” kuralı [...] gerçek onun değeri kullanılır etmediğini tahmin eğer bir ifadenin kısmını değerlendirmek gerekmez uygulama ve o denir Programın gözlemlenebilir davranışını etkileyen hiçbir yan etki üretilmektedir.

Yani,

int doSomething() { return 1; } 

gibi bir şey uzağa optimize olabilir ama

int doSomething() { std::cout << "d\n"; return 1; } 

izin verilmez.

Ayrıca, C++ 11'den beri daha karmaşık işlevler yazabilir ve bunları constexpr kullanarak derleme zamanında değerlendirebilirsiniz.

İlgili konular