
3) I disagree with
explicit complex(const T& re = T(0.), const T& im = T(0.)) I believe this constructor should be non-explicit. See ISO/IEC 14882:2011, Section 26.4.2.
With which I, myself, disagree. It's funny, because even my suggested correction is wrong---again! I believe the form of the constructor is actually: complex(const T& re = T(), const T& im = T()); The default parameters are not initialized to zero, but rather to the default constructor of the template type T. There is a subtle difference, and one which masks user-error in a "too-forgiving" fashion. It's a real pitfall because it makes the wrong code seemingly work right and then be break when complex is fixed. A long time ago, the man known as STL brought this to my attention. But I re-made the same mistake again, and again... In a potential review, we should go through the constructors meticulously and make sure they are as they should be. Best regards, Chris.