在容器中存储常量字符串文字
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 的生命周期问题。
它们是字面上的文字
我有一个 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 的生命周期问题。
它们是字面上的文字