難しい話になってるけど、当初の自分(質問者)の問いに対して現時点で納得している答えはこれ。
typedef double T;
std::complex<T> c(1.0,1.0);
std::array<T,2> a;
std::copy_n(reinterpret_cast<T(&)[2]>(c),2,&a[0]);
std::copy_n(&a[0],2,reinterpret_cast<T(&)[2]>(c));
これで大丈夫なのか?

対称に書けてよろしいけど、
std::vector<T> c;
とか
std::valarray<T> c;
(aじゃないよ!)に対して同じコードではコンパイルは通るけど実行時にぐちゃぐちゃ(可変長だから?)。
結局reinterpret_cast<T*>(...)が万能ってことだろうか・・・。