Невозможно инициализировать вектор массива const char * / string со списком инициализаторов при объявлении - PullRequest
0 голосов
/ 16 сентября 2018

Изначально я начал пытаться инициализировать вектор const char * [3] списком инициализаторов при объявлении

vector<const char*[3]> v = { { "a", "b", "c" } };

И это дает ошибку

matrix must be initialized with a brace-enclosed initializer

Я подумал, что это может быть из-за const char *, хотя это казалось странным, и изменил его на строки

vector<string[3]> v = { { "a", "b", "c" } };

Но ошибка сохраняется. Я попробовал несколько комбинаций скобок безрезультатно. Можно ли на самом деле инициализировать эту структуру при объявлении с помощью списка инициализаторов?

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

Не удается скомпилировать, потому что std::vector требует, чтобы его T было CopyAssignable . Независимо от его RHS, это утверждение не будет компилироваться:

vector<const char*[3]> v = { { "a", "b", "c" } }; // Error

так же, как это не скомпилируется:

std::vector<const char*[3]> v;
const char* charPtrArr[3] { "a", "b", "c" };
v.push_back(charPtrArr); // Error

Это всего лишь частный случай того факта, что массивы в стиле C не могут быть назначены , что продемонстрировано в коде напрямую с использованием static_assert:

static_assert(std::is_copy_assignable<const char*[3]>()); // Error

или, в более общем смысле, я думаю:

static_assert(std::is_copy_assignable<int[]>()); // Error

Если вы действительно хотите, чтобы std::vector массивов размера 3 содержал указатели char, то это безошибочный способ C ++ 11:

vector<array<const char*, 3>> v = { { "a", "b", "c" }, { "d", "e", "f"} };
0 голосов
/ 16 сентября 2018

Проблема в том, что массив в стиле C не может быть передан копированием или перемещен в аргументе функции.В результате этот код не будет работать

vector<const char*[3]> v;
const char* item[3] { "a", "b", "c" };
v.push_back(item); // will not compile

https://wandbox.org/permlink/LumvUzPnYWew7uMu
По сути, это та же проблема, но задействован список инициализации.

C ++ 11 дает простое решениедля вашей проблемы:

vector<array<const char*, 3>> v { { "a", "b", "c" }, { "d", "e", "f"} };

https://wandbox.org/permlink/IHNoSrH9BWV1IUoQ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...