Isn't that what the std::complex default constructor does? It does and I think it's a bad practice.
explicit complex(const complex<double>&); explicit complex(const complex<long double>&);
Why are they explicit ? Where is the risk to have non-explicit destructor ?
The standard states that "The effect of instantiating the template complex for any type other than float, double or long double is unspecified." (26.2) A point I wasn't aware of. What about enforcing this at the compile-time level using CT-assert ?
I think that you are correct about operators on two complex types. However, it is probably not a good idea to have operator overloads like the following template
complex<T> operator+(const U& lhs, const complex<T>& rhs); because they can cause ambiguities. Is having the followign triplet lead to ambiguity ?
template