相关疑难解决方法(0)

将用户定义的文字用于字符串而不是字符串文字的优点

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[]文字是否有任何好处?

c++ string user-defined-literals c++14

54
推荐指数
3
解决办法
3192
查看次数

std :: string常量的正确习惯用法?

我有一个代表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 没有简单的常量

c++ string constants

24
推荐指数
3
解决办法
1万
查看次数

标签 统计

c++ ×2

string ×2

c++14 ×1

constants ×1

user-defined-literals ×1