初始化c字符串向量 是下面的代码合法C++吗?为什么?它可能有什么风险 std::vector<const char *> v1 = {"a", "b", "c"};

初始化c字符串向量 是下面的代码合法C++吗?为什么?它可能有什么风险 std::vector<const char *> v1 = {"a", "b", "c"};,c++,vector,c-strings,initializer-list,string-literals,C++,Vector,C Strings,Initializer List,String Literals,当构造函数返回后,init的生存期结束时,这些字符串文本不应该过期吗?一旦知道答案,我意识到这是一个愚蠢的问题。 发件人: 字符串文字具有静态存储持续时间,因此在程序的整个生命周期中都存在于内存中 这就解释了一切。你说的“合法”是什么意思?如果你的意思是“这段代码应该编译吗?”你可以很容易地自己检查。然而,如果你的意思是“这个代码会产生UB吗?”,请解释你的理由,为什么你认为它应该产生UB。关于3和4,这里只有一个向量。没有创建临时的向量。这是一个初始化,所以它只是对构造函数的直接调用。与std

当构造函数返回后,
init
的生存期结束时,这些字符串文本不应该过期吗?

一旦知道答案,我意识到这是一个愚蠢的问题。 发件人:

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


这就解释了一切。

你说的“合法”是什么意思?如果你的意思是“这段代码应该编译吗?”你可以很容易地自己检查。然而,如果你的意思是“这个代码会产生UB吗?”,请解释你的理由,为什么你认为它应该产生UB。关于3和4,这里只有一个向量。没有创建临时的
向量
。这是一个初始化,所以它只是对构造函数的直接调用。与
std::vector v1{“a”、“b”、“c”相同
template <typename T>
vector<T>::vector(initializer_list<T> init)
{
  // shallow copy from init to this
}