Taslak standardın değerlendirme sırasına ilişkin bu kısmının konuyla ilgili olduğunu düşünüyorum:
1.9 Program Yürütme
...
- Belirtilenler dışında, tek tek operatörlerin işlenenlerinin ve tek tek ifadelerin alt ifadelerinin değerlendirmeleri sıralı değildir. Bir operatörün işlenenlerinin değer hesaplamaları, operatörün sonucunun değer hesaplamasından önce sıralanır. Bir skaler nesne üzerindeki bir yan etki, aynı skaler nesne üzerindeki başka bir yan etkiye veya aynı skaler nesnenin değerini kullanan bir değer hesaplamasına göre sıralanmamışsa ve potansiyel olarak eşzamanlı değilse, davranış tanımsızdır.
ve ayrıca:
5.2.2 İşlev çağrısı
...
- [Not: Sonek ifadesinin ve bağımsız değişkenlerin değerlendirmeleri birbirine göre sıralanmamıştır. Bağımsız değişken değerlendirmelerinin tüm yan etkileri, işleve girilmeden önce sıralanır - son not]
Öyleyse, satırınız c.meth1(&nu).meth2(nu);
için, son çağrı için fonksiyon çağrısı operatörü açısından operatörde neler olduğunu düşünün meth2
, böylece postfix ifadesi ve argümanındaki dökümü açıkça görüyoruz nu
:
operator()(c.meth1(&nu).meth2, nu);
Sonek ekspresyonu ve argüman değerlendirmeler son işlev çağrısı için (sonek ifade yani c.meth1(&nu).meth2
ve nu
) olan birbirine unsequenced göre uygun olarak işlev çağrısı üzerinde kural. Bu nedenle, skaler nesne üzerindeki sonek ifadesinin hesaplanmasının yan etkisi , işlev çağrısından önceki ar
argüman değerlendirmesine göre sıralanmaz . Tarafındannu
meth2
program yürütme yukarıdaki kural, bu tanımsız davranıştır.
Diğer bir deyişle, derleyicinin çağrıdan sonra çağrının nu
argümanı değerlendirmesine gerek yoktur - etkinin hiçbir yan etkisi olmadığını varsaymak ücretsizdir .meth2
meth1
meth1
nu
değerlendirmeyi .
Yukarıda üretilen montaj kodu, main
fonksiyonda aşağıdaki sırayı içerir :
- Değişken
nu
yığın üzerinde tahsis edilir ve 0 ile başlatılır.
- Bir kayıt (
ebx
benim durumumda) değerinin bir kopyasını alırnu
- Adresleri
nu
vec
parametre kayıtlarına yüklenir
meth1
denir
- Dönüş değeri kayıt ve önceden önbelleğe değer arasında
nu
yerebx
kayıt parametre kaydediciler tarafından ön değerlere
meth2
denir
Kritik olarak, yukarıdaki 5. adımda derleyici, nu
2. adımdaki önbelleğe alınan değerin işlev çağrısında yeniden kullanılmasına izin verir meth2
. Burada nu
, çağrı ile değiştirilmiş olabilecek olasılığı göz ardı eder .meth1
, eylemde 'tanımsız davranış' .
NOT: Bu cevabın özü orijinal halinden farklıdır. Son işlev çağrısından önce sıralanmamış olan işlenen hesaplamasının yan etkileri açısından ilk açıklamam yanlıştı çünkü yanlıştı. Sorun, işlenenlerin kendilerinin hesaplanmasının belirsiz bir şekilde sıralanması gerçeğidir.