Декларация является законной и корректной.
new T[...]
возвращает указатель T*
, где T
в данном случае vector<string>*
. Таким образом, new vector<string>*[...]
возвращает vector<string>**
, то есть то, что p
объявлено как.
Однако этот вид кодирования также довольно бесполезен в современном коде, поэтому нет, он "не имеет смысла" ». Вместо этого он должен выглядеть примерно так:
vector<vector<string>*> p(10);
Или, более вероятно (при условии, что отдельные vector
s будут выделены с new
):
vector<std::unique_ptr<vector<string>>> p(10);
Но на самом деле все должно быть просто так:
vector<vector<string>> p(10);
И затем, поскольку используется фиксированная длина, внешняя vector
следует изменить на std::array
вместо этого:
array<vector<string>, 10> p;
ОЧЕНЬ РЕДКО имеет ли смысл динамически выделять стандартный C ++ контейнеры.