初始化一个 C 字符串向量
Initializing a vector of c-strings
下面的代码是合法的 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
的生命周期在构造函数 return 之后结束时,那些字符串文字不应该过期吗?
好吧,一旦我知道了答案,我就意识到这是一个愚蠢的问题。
来自 cppreference.com:
String literals have static storage duration, and thus exist in memory for the life of the program.
这说明了一切。
下面的代码是合法的 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
的生命周期在构造函数 return 之后结束时,那些字符串文字不应该过期吗?
好吧,一旦我知道了答案,我就意识到这是一个愚蠢的问题。 来自 cppreference.com:
String literals have static storage duration, and thus exist in memory for the life of the program.
这说明了一切。