在容器中存储常量字符串文字

Storing constant string literals in a container

我有一个 struct foo { const char* s, ... }; 形式的结构 foo bar 和一个 std::vector<foo> v;,我想 push_back 一些 foo s 成员字段的常量值,即

bar.push_back({ "1", /*...*/ });
bar.push_back({ "2", /*...*/ });
bar.push_back({ "3", /*...*/ });
//...

现在,如果我没有完全错的话,这是不安全的,因为字符串文字的生命周期被限制在初始化程序大括号的范围内。因此,字符串文字 "1" 的生命周期应该已经在第二个 push_back.

行结束

我们该如何处理?我们真的需要创建第二个容器 strong std::string 并将相应的 c_str() 指针传递给 bar 吗?

只要您仅使用 string literals 初始化 const char *s ,这是安全的。它们的生命周期与您的程序的生命周期相同。

考虑字符串文字的方式就好像它们是指向 const 字符的 const 指针。 事实上,如果您使用相同的字符串字面量初始化两个变量,在大多数编译器实现中,它们实际上会指向相同的地址。

您可以通过在将 const char* 指针转换为整数后打印出它们来验证这一点。

因此,字符串文字的“生命周期”不再是常量 99 的生命周期问题。

它们是字面上的文字