AIX'de xlC ile aşağıdakileri derlemek, "2 2" yi basan bir kodla sonuçlanır. Linux'ta gcc ve clang ile güvenilir şekilde "3 3" üretir. AIX combine
dönüş değerine RVO uyguluyor gibiRVO'nun geri dönüşten önceki parametrede üzerine yazma değeri
#include <iostream>
struct Numbers
{
Numbers() : a(0) , b(0) { }
Numbers(int a, int b) : a(a), b(b) { }
int a;
int b;
};
Numbers combine(const Numbers& a, const Numbers& b)
{
Numbers x;
x.a = a.a + b.a;
x.b = a.b + b.b;
return x;
}
Numbers make()
{
Numbers a(1, 1);
Numbers b(2, 2);
a = combine(a, b);
return a;
}
int main()
{
Numbers a = make();
std::cerr << a.a << " " << a.b << "\n";
}
bana görünüyor, bu yüzden Numbers x
oluştururken, varsayılan x
başlatılmak ile benim parametresini a
üzerine yazarak biter.
Burada tanımlanmamış bazı davranışları çağırıyorum mu? a
combine(a, b)
'un değerlendirilip a
'a atanmasına kadar hiçbir değişiklik yapılmamasını beklerim.
Bu
ile geçerli: AIX için IBM XL C/C++, V12.1 (5765-J02, 5725-C72) Versiyon: 12.01.0000.0012 Bu derleyici benziyor
Ben UB burada görmüyorum. Derleyici bir hata gibi görünüyor. – Jarod42
Eğer "std :: cerr << a.a <<" "<< a.b <<" \ n ";' make() 'içine eklerseniz ne olur? – NathanOliver
Geri dönüş birleştirmeyi (a, b); – Jarod42