byłem orzeźwiający moje rozumienie wartości inicjalizacji kontra default-inicjalizacji, i natknąłem this:Dlaczego to proste niezdefiniowane zachowanie?
struct C {
int x;
int y;
C() { }
};
int main() {
C c = C();
}
Najwyraźniej jest UB ponieważ
W przypadku C(), istnieje konstruktor, który może inicjować elementy x i y, więc inicjalizacja nie ma miejsca. Próba skopiowania C() do c powoduje więc niezdefiniowane zachowanie.
Myślę, że rozumiem, dlaczego, ale nie jestem pewien. Czy ktoś może rozwinąć?
Czy to oznacza, że jest to również UB?
int x; x = x;
Nawiasem mówiąc, w odniesieniu do inicjalizacji wartości, czy zagwarantowane jest zero?
int x = int();
Nie jesteś pewien co masz na myśli. Jeśli masz na myśli wartości x i y, które nie zostaną zainicjalizowane, to tak, ale odpowiedziałeś na własne pytanie (ponieważ konstruktor tego nie robi). Co do Cc = C(); Myślę, że to jest całkowicie poprawne. – Sid
Myślałem, że to też było całkowicie ważne, dopóki ktoś nie twierdził inaczej. Kiedy go czytam, pierwszy fragment może tylko UB, jeśli drugi też jest, w przeciwnym razie jest to prosta niezainicjowana wartość, bez deamonów nosowych. – spraff
@Sid: Nie, użycie wartości niezainicjowanego obiektu daje niezdefiniowane zachowanie. –