A lifetime parameter denotes a region or duration where a value is valid.
The compiler needs these validity annotations to prove memory safety of code. If the compiler didn't know which values are required to live at which place/time, it couldn't supply such proofs.
So, here we are saying to the compiler that how long references are valid is determined by the expression or block of code in which the struct is created? Correct?
Yes, basically, at a very basic level — and then there is a bunch of other, more nuanced rules (mainly around subtyping and variance).
Note that the concrete lifetimes can usually be inferred from the code locally (ie., within a function body). In the definition of a user-defined type, there's nothing to infer a concrete lifetime from. So you must communicate the fact that your type must be parameterized by a lifetime, and link any parameters of the contained lifetime-requiring types with those of your own type.
The lifetime annotations are like breadcrumbs, tracing back all the way where the value is being borrowed from, to restrict usage of the struct to only that scope. If you borrow a local variable when making the struct instance, then the instance will be forever tied to the scope of this loan of this variable.
The annotations are like assertions checking what the code is doing. They do not influence compilation in any way. The compiler can't make anything live longer.