g++って三項演算子をちゃんと扱えてない気がするんだけどどうですか?

pc.reset(id == 0 ? new aaa(0, "Aaa"):
     id == 12 ? new aaa(12, "Aaa"):
           new bbb(id) );
みたいなかんじなの