Maybe I'm missing something, but why is it crucial that you hold on to a reference to the contents of the vector, and not the vector itself? Because, to me, the obvious "C++ way" to do it would be something like
struct FieldInfo {
//
const std::vector<ast::Attribute>& attrs;
}