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).meth2ve 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 arargüman değerlendirmesine göre sıralanmaz . Tarafındannumeth2 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 nuargümanı değerlendirmesine gerek yoktur - etkinin hiçbir yan etkisi olmadığını varsaymak ücretsizdir .meth2meth1meth1nu değerlendirmeyi .
Yukarıda üretilen montaj kodu, mainfonksiyonda 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
nuvec parametre kayıtlarına yüklenir
meth1 denir
- Dönüş değeri kayıt ve önceden önbelleğe değer arasında
nuyerebx kayıt parametre kaydediciler tarafından ön değerlere
meth2 denir
Kritik olarak, yukarıdaki 5. adımda derleyici, nu2. 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.