Your value_initialized and default_initialized arrays have zero size.
Finally, it isn't that the behavior of the std::cout << *x1 is undefined, but that the value of *x1 is undefined. This behavior is well defined: it will print the value of x1, but that value might be anything.
"Undefined value" means that the compiler and operating system can put whatever they want there. Different compilers can put different things there. Adding or changing other code can cause the value to change. Basically it means "don't complain about what's there. Ever."
> it isn't that the behavior of the std::cout << *x1 is undefined,
It is undefined behaviour.
Not even undefined behaviour by omission - "Undefined behavior may be expected when this International Standard omits any explicit definition of behavior".
This is explicitly specified undefined behaviour.
Lvalue-to-rvalue conversion
A glvalue of a non-function, non-array type T can be converted to a prvalue. ...
If the object ..., or if the object is uninitialized, a program that necessitates this conversion has undefined behavior.
Footnote: For historical reasons, this conversion is called the “lvalue-to-rvalue” conversion, even though ... - IS
> are the values of *x2 AND *x3 also UB
If a program engenders undefined behaviour, then the entire program has undefined behaviour (the IS "places no requirement on the implementation executing that program").
However, if any such execution contains an undefined operation, this International Standard places no requirement on the implementation executing that program with that input (not even with regard to operations preceding the first undefined operation).
are the following comments describe the initialisation in the right way :
1 2 3 4 5 6 7 8
vector<int> v1; // empty vector
vector<int> v2(); // empty vector
vector<int> v3{}; // empty vector
vector<int> v4{1}; // v4 contains 1 element whose value is 1
vector<int> v5{1,2,3,4,5}; // vector v4 contains 5 elements whose value is 1,2,3,4,5
vector<int> v6(32,9); // v6 contains 36 elements with each having a value of 9
vector<int> v7 = {1,2,3,4,5}; //same as v5
vector<int> v8(32,9); // 32 elements initialized to 9
std::vector<int> v4{1}; // v4 contains 1 element whose value is 1
std::vector<int> v41(1); // v41 contains 1 element whose value is zero
std::vector<int> v8(32,9); // 32 elements initialized to 9
std::vector<int> v81{32,9}; // size is 2, elements are 32, 9