Вы можете return V
без проблем - он вернет копию локальной переменной. Проблемы возникают, только когда вы возвращаете ссылку или указатель на переменную с локальной областью видимости; когда функция завершается, локальная переменная выходит из области видимости и уничтожается, а ссылка / указатель больше не действительны.
В качестве альтернативы вы можете принять ссылку на вектор в качестве аргумента, записать его и вернуть void:
void generate(int n, std::vector< std::vector<int> >& vec) {
vec.resize(n, std::vector<int>(1 << n, 0));
}
int main() {
std::vector< std::vector<int> > v;
generate(10, v);
}
Это быстрее, чем возвращать копию локального члена, что может быть дорого для больших объектов, таких как многомерные векторы.