Tanımsız davranışlar bağırmaya başlamadan önce, bu açıkça N4659'da listelenir (C ++ 17)
i = i++ + 1; // the value of i is incremented
Yine de N3337'de (C ++ 11)
i = i++ + 1; // the behavior is undefined
Ne değişti?
Anladığım kadarıyla, gelen [N4659 basic.exec]
Belirtilen durumlar dışında, münferit operatörlerin işlenenlerinin ve münferit ifadelerin alt ifadelerinin değerlendirmeleri birbirinden bağımsız değildir. [...] Bir operatörün işlenenlerinin değer hesaplamaları, operatörün sonucunun değer hesaplamasından önce sıralanır. Bir bellek konumundaki bir yan etki, aynı bellek konumundaki başka bir yan etkiye veya aynı bellek konumundaki herhangi bir nesnenin değerini kullanan bir değer hesaplamasına göre sıralanmamışsa ve bunlar potansiyel olarak eşzamanlı değilse, davranış tanımsızdır.
Burada değeri de tanımlanmıştır [N4659 basic.type]
Önemsiz olarak kopyalanabilen türler için değer temsili, nesne temsili içinde, bir uygulama tarafından tanımlanan bir değer kümesinin ayrı bir öğesi olan bir değeri belirleyen bir bitler kümesidir
Kaynaktan [N3337 basic.exec]
Belirtilen durumlar dışında, münferit operatörlerin işlenenlerinin ve münferit ifadelerin alt ifadelerinin değerlendirmeleri birbirinden bağımsız 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, davranış tanımsızdır.
Benzer şekilde, değer [N3337 basic.type] ' de tanımlanır
Önemsiz olarak kopyalanabilen tipler için değer temsili, nesne temsili içinde, uygulama tanımlı bir değer kümesinin ayrı bir öğesi olan bir değeri belirleyen bir bitler kümesidir.
Onlar önemli değil eşzamanlılık denince hariç özdeştir ve kullanımı ile hafıza konumu yerine skaler nesne ,
Aritmetik türler, numaralandırma türleri, işaretçi türleri, işaretçi-üye türleri
std::nullptr_t
ve bu türlerin cv-nitelikli sürümleri topluca skaler tipler olarak adlandırılır.
Hangi örneği etkilemez.
Gönderen [N4659 expr.ass]
Atama işleci (=) ve bileşik atama işleçlerinin tümü sağdan sola gruplandırılır. Hepsi sol işlenen olarak değiştirilebilir bir değer gerektirir ve sol işlenene referansla bir değer döndürür. Sol işlenen bir bit alanı ise, her durumda sonuç bir bit alanıdır. Her durumda, atama, sağ ve sol işlenenlerin değer hesaplamasından sonra ve atama ifadesinin değer hesaplamasından önce sıralanır. Sağ işlenen, sol işlenenden önce sıralanır.
Gönderen [N3337 expr.ass]
Atama işleci (=) ve bileşik atama işleçlerinin tümü sağdan sola gruplandırılır. Hepsi sol işlenen olarak değiştirilebilir bir değer gerektirir ve sol işlenene referansla bir değer döndürür. Sol işlenen bir bit alanı ise, her durumda sonuç bir bit alanıdır. Her durumda, atama, sağ ve sol işlenenlerin değer hesaplamasından sonra ve atama ifadesinin değer hesaplamasından önce sıralanır.
Tek fark N3337'de bulunmayan son cümledir.
Sol işlenen olarak son cümle ancak, herhangi bir öneme sahip olmamalıdır i
ne olduğunu "Başka bir yan etki" ne de "aynı skaler nesnenin değerini kullanarak" olarak id-ifadesi bir lvalue olduğunu.
i = i++ + 1;
.