Почему список инициализатора строкового литерала для std :: vector не может создать std :: vectorв С ++? - PullRequest
2 голосов
/ 30 октября 2019

В C ++, если я сделаю:

std::vector words {"some","test","cases","here"};
  • Кто-нибудь может объяснить, почему words не является контейнером std::vector<std::string>?

  • Разве C ++ не должен выводить тип через список инициализаторов, который я дал?

  • Если "some", "test"не строковые литералы, как выглядят строковые литералы?

1 Ответ

9 голосов
/ 30 октября 2019

a строковый литерал , как и "something", является c-строкой. Он создает const char[N] со статической продолжительностью хранения, где N - это количество символов плюс нулевой терминатор. Это означает, что когда вы делаете

std::vector words {"some","test","cases","here"};

, вы создали std::vector<const char*>, так как массивы могут распадаться на указатели.

Если вы хотите std::vector<std::string>, тогда вам нужноиспользовать std::string пользовательский литерал . Это выглядело бы как

using namespace std::string_literals;
std::vector words {"some"s,"test"s,"cases"s,"here"s};

, и теперь у вас есть фактически std::string s, которые компилятор будет использовать для определения типа вектора.

...