> 'static is not the "lifetime of the entire application" when it is used in the context of T: 'static.
Yes it is.
T: 'static means T can live up to the end of the "lifetime of the entire application".
> ...but it can also have values in it which are not 'static.
I don't follow. Values are indeed bound by 'static. If they weren't we wouldn't be able to pass values to other threads (which can potentially last as long as our application's main thread).
> 'static is not the "lifetime of the entire application" when it is used in the context of T: 'static.
It is. Any owned instance without non-'static references inside can live up to the "lifetime of the entire application". You might drop them earlier if you wanted to, but you don't have to since it can live up to the "lifetime of the entire application" and therefore can be passed for example into a thread that can hold the value up to the end of the "lifetime of the entire application".
Any owned value can be held indefinitely as long as the program is running.
I'm taking a guess here: you mean that values' lifetimes can be constrained (I guess you mean by dropping the actual value). But it's the owner the one that ended it earlier, not the caller (where 'static applied). You will never be able to have an owned value with a lifetime shorter than 'static without dropping it and, if you drop it, you cannot pass it anywhere. Hence why any owned type that is passed is, by definition, bound by 'static.
> ...but my take on it is:
> - IF you take "x is 'static" as meaning the "X is valid for entire lifetime of the application"
> then if:
> - x: &'static 'is static' and must be valid for the entire lifetime of the application.
> I would expect:
> - x: T + 'static 'is static' and must be valid for the entire lifetime of the application.
Your expectations are correct and that's what it is. Just replace "must be valid" with "can live up to".
That's why you need to pass T: 'static to threads, because a separate thread needs something to hold up to the end of the application since a thread can potentially never end.
https://doc.rust-lang.org/std/thread/fn.spawn.html