Проще говоря, var
не инициализируется, и чтение неинициализированной переменной приводит к неопределенному поведению .
Так что не делайте этого.В тот момент, когда вы это делаете, вашей программе больше не гарантируется выполнение того, что вы говорите.
Формально «чтение» значения означает выполнение преобразования lvalue в rvalue.И §4.1 гласит: «... если объект неинициализирован, программа, которая требует этого преобразования, имеет неопределенное поведение».
Прагматически, это просто означает, что значение является мусором (в конце концов, легко увидеть чтениеint
, например, просто получает случайные биты), но мы не можем заключить это, иначе вы бы определили неопределенное поведение.
Для реального примера рассмотрим:
#include <iostream>
const char* test()
{
bool b; // uninitialized
switch (b) // undefined behavior!
{
case false:
return "false"; // garbage was zero (zero is false)
case true:
return "true"; // garbage was non-zero (non-zero is true)
default:
return "impossible"; // options are exhausted, this must be impossible...
}
}
int main()
{
std::cout << test() << std::endl;
}
Наивно можно было бы заключить (через аргументацию в комментариях), что это никогда не должно печатать "impossible"
;но с неопределенным поведением все возможно.Скомпилируйте его с g++ -02
.