I've used several template libraries and don't much care for them. They work pretty well when used strictly as designed but, as you demonstrate, they don't always provide consistent interpretations when referencing, dereferencing and casting are involved.
When you cast ( (char*)s, for instance) and reference (&s), I suspect the compiler reverts to standard C++ rules and your results are as expected. Casting is not an operator function (so is not overloaded) and, I'm pretty sure, referencing isn't usually considered to be overloadable, either.
(char*)s is the pointer stored at s, (char*)t is the pointer stored at t and they
should be different.
(char*)s[0] would mean "interpret the first character of the array as a pointer" and, if the s[0] and t[0] are the same, the results would be the same.
&s would be the address of the variable s, not the addresss of the array. &s[0]
would be the address of the array and &s[0]==s, not &s.
Guess that's why I stick to good ol' ANSI C++!