Инициализация объекта с неопределенным значением - PullRequest
2 голосов
/ 15 декабря 2011

Вызывает ли следующее неопределенное поведение?

int x;
int i = x;

Ссылка из C ++ 03

(4.1 / 1) Если объект, на который ссылается lvalue, не являетсяобъект типа T и не является объектом типа, производного от T, или , если объект неинициализирован , программа, которая требует этого преобразования, имеет неопределенное поведение.

Редактировать: Однако, из (3.3.1 / 1) объект может быть инициализирован с его собственным неопределенным значением, почему это так?то есть

int x = x; //not an undefined behaviour

Ответы [ 5 ]

6 голосов
/ 15 декабря 2011

Да, потому что вы читаете значение переменной (x), которая не была инициализирована и не назначена.

1 голос
/ 15 декабря 2011

Не определено, если x неинициализировано, как сказано в вашей цитате.

int x; // 0 initialized
int i = x;

int main() {
  int z; // not initialized
  int k = z; // UB
}
0 голосов
/ 15 декабря 2011

int x = x;// не неопределенное поведение

Неверно.

0 голосов
/ 15 декабря 2011

Единственное, что нужно помнить, это то, что все в порядке:

static int x;
int j = x;

но ваш пример - нет.

0 голосов
/ 15 декабря 2011

Это вызывает совершенно определенное поведение.Какое бы значение мусора х ни было при его размещении в стеке, оно будет присвоено i как есть.

Однако в зависимости от вашего компилятора вы можете получить предупреждение во время компиляции об обращении к неинициализированной переменной.

...