Является ли следующий код допустимым C ++? И почему? Какой риск это может иметь?
std::vector<const char *> v1 = {"a", "b", "c"};
Я думаю о том, как это работает, относительно времени жизни строковых литералов. Насколько я понимаю:
- Компилятор создает временный массив c-строк.
- Он назначает временный массив для
std::initializer_list<const char*>
- Позвонить конструктору
vector( std::initializer_list<const char *> init)
- Скопировать конструкт
v1
из временного вектора.
Что ж, меня беспокоит то, не истек ли срок жизни этих строковых литералов после шага 3? почему?
Неважно, существует ли временный вектор. Моя точка зрения такова, если конструктор реализован так:
template <typename T>
vector<T>::vector(initializer_list<T> init)
{
// shallow copy from init to this
}
Не должны ли истечь эти строковые литералы, когда закончится время жизни init
после возврата конструктора?