Инициализация вектора c-строк - PullRequest
0 голосов
/ 24 января 2019

Является ли следующий код допустимым C ++? И почему? Какой риск это может иметь?

std::vector<const char *> v1 = {"a", "b", "c"};

Я думаю о том, как это работает, относительно времени жизни строковых литералов. Насколько я понимаю:

  1. Компилятор создает временный массив c-строк.
  2. Он назначает временный массив для std::initializer_list<const char*>
  3. Позвонить конструктору vector( std::initializer_list<const char *> init)
  4. Скопировать конструкт v1 из временного вектора.

Что ж, меня беспокоит то, не истек ли срок жизни этих строковых литералов после шага 3? почему?

Неважно, существует ли временный вектор. Моя точка зрения такова, если конструктор реализован так:

template <typename T>
vector<T>::vector(initializer_list<T> init)
{
  // shallow copy from init to this
}

Не должны ли истечь эти строковые литералы, когда закончится время жизни init после возврата конструктора?

1 Ответ

0 голосов
/ 24 января 2019

Ну, я понимаю, что это глупый вопрос, когда я знаю ответ.От cppreference.com :

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

Это объясняетвсе.

...