c++11: use std::make_shared
c++11: use auto