初始化一个 C 字符串向量

Initializing a vector of c-strings

下面的代码是合法的 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 的生命周期在构造函数 return 之后结束时,那些字符串文字不应该过期吗?

好吧,一旦我知道了答案,我就意识到这是一个愚蠢的问题。 来自 cppreference.com:

String literals have static storage duration, and thus exist in memory for the life of the program.

这说明了一切。