It is a very common example to use std::byte / unsigned char arrays with std::construct_at to provide the storage.
//say A is a NON standard-layout class user-defined class
alignas(A) std::byte storage[sizeof(A)];
std::construct_at(reintrepret_cast<A*>(storage), A{});
However, std::construct_at accepts a pointer to the object, while if you reintrepre_cast a pointer to std::byte / unsigned char array it should still point to the first member of std::byte / unsigned char array. So is the code above illegal? And if so, how to provide a valid pointer to std::construct_at?
cppreference is not a standard so I don't see it as a reliable source. It has to be proven by a quote from the standard.
That storage points to the array of unsigned char in your example and not to A. Although I think the reason construct_at takes a pointer, is because it wants to know the type of the object it wants to construct, and the pointer to A is converted to void anyway by the implementation of construct_at. This way it is still compliant with the standard.
Note here it is said that storage is an array object!
Here it says what can be done with reintepret_cast and obviously unsigned char array and A are not pointer-interconvertible.
However, reintepret_cast still can be called as long as it is result is not used apart from converting it to another type