初始化 c 字符串的向量

Initializing a vector of c-strings

本文关键字:向量 字符串 初始化      更新时间:2023-10-16

以下代码是否合法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生存期结束时,这些字符串文本不应该过期吗?

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

字符串文本具有静态存储持续时间,因此在程序的生命周期内存中存在。

这解释了一切。