SO文档中的字符串主题用于说明,在备注部分:
由于C++ 14,而是采用
"foo",则建议使用"foo"s,因为s是一个字符串,其将const char *"foo"到std::string"foo".
我看到的唯一优势
std::string str = "foo"s;
Run Code Online (Sandbox Code Playgroud)
代替
std::string str = "foo";
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,编译器可以执行copy-elision(我认为),这比第二种情况下的构造函数调用要快.
尽管如此,这是(尚未)保证,因此第一个也可能会调用构造函数,即复制构造函数.
忽略需要使用std::string文字的情况
std::string str = "Hello "s + "World!"s;
Run Code Online (Sandbox Code Playgroud)
使用std::string文字而不是const char[]文字是否有任何好处?
我有一个代表DB对象的地图.我希望从中得到"众所周知"的价值观
std::map<std::string, std::string> dbo;
...
std::string val = map["foo"];
Run Code Online (Sandbox Code Playgroud)
一切都很好但是我觉得"foo"在每次通话时都被转换为临时字符串.当然,拥有一个常量的std :: string会更好(当然,与刚刚获取对象的磁盘IO相比,它可能只是一个很小的开销,但我认为它仍然是一个有效的问题).那么std :: string常量的正确习惯是什么?
例如 - 我可以
const std::string FOO = "foo";
Run Code Online (Sandbox Code Playgroud)
在hdr中,但后来我得到了多份副本
编辑:还没有回答说如何声明std :: string常量.忽略整个地图,STL等问题.很多代码都是以std :: string为导向的(我当然是这样)并且很自然地需要为它们设置常量而不需要为内存分配反复付费
EDIT2:从曼努埃尔手中接过PDF回答的二级问题,添加了一个不好习惯的例子
编辑3:答案摘要.请注意,我没有包含那些建议创建新字符串类的内容.我很失望,因为我希望有一个简单的东西只能在头文件中工作(如const char*const).无论如何
a)来自马克b
std::map<int, std::string> dict;
const int FOO_IDX = 1;
....
dict[FOO_IDX] = "foo";
....
std:string &val = dbo[dict[FOO_IDX]];
Run Code Online (Sandbox Code Playgroud)
b)来自vlad
// str.h
extern const std::string FOO;
// str.cpp
const std::string FOO = "foo";
Run Code Online (Sandbox Code Playgroud)
c)来自Roger P.
// really you cant do it
Run Code Online (Sandbox Code Playgroud)
(b)似乎与我想要的最接近,但有一个致命的缺陷.我不能拥有使用这些字符串的静态模块级代码,因为它们可能尚未构建.我想过(a)并且实际上在序列化对象时使用类似的技巧,发送索引而不是字符串,但对于通用解决方案来说似乎有很多管道.很遗憾(c)获胜,std:string 没有简单的常量