Rak*_*111 54 c++ string user-defined-literals c++14
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[]
文字是否有任何好处?
Nic*_*las 50
如果你是"几乎总是自动"人群的一部分,那么UDL就非常重要.它可以让你这样做:
auto str = "Foo"s;
Run Code Online (Sandbox Code Playgroud)
因此,str
将是一个真正的std::string
,而不是一个const char*
.因此,它允许您决定何时做.
这对于自动返回类型扣除也很重要:
[]() {return "Foo"s;}
Run Code Online (Sandbox Code Playgroud)
或任何形式的类型演绎,真的:
template<typename T>
void foo(T &&t) {...}
foo("Foo"s);
Run Code Online (Sandbox Code Playgroud)
我看到使用[...]而不是[...]的唯一优势是,在第一种情况下,编译器可以执行copy-elision(我认为),这比第二种情况下的构造函数调用更快.
Copy-elision并不比构造函数调用快.无论哪种方式,您都在调用对象的构造函数之一.问题是哪一个:
std::string str = "foo";
Run Code Online (Sandbox Code Playgroud)
这将挑起来的构造函数的调用std::string
,这需要const char*
.但由于std::string
必须将字符串复制到自己的存储中,因此必须获取字符串的长度.并且因为它不知道长度,所以这个构造函数被strlen
用来获取它(从技术上来说char_traits<char>::length
,但这可能不会更快).
相比之下:
std::string str = "foo"s;
Run Code Online (Sandbox Code Playgroud)
这将使用具有此原型的UDL模板:
string operator "" s(const char* str, size_t len);
Run Code Online (Sandbox Code Playgroud)
请参阅,编译器知道字符串文字的长度.因此,UDL代码传递一个指向字符串和大小的指针.因此,它可以调用std::string
带a const char*
和 a 的构造函数size_t
.所以不需要计算字符串的长度.
有问题的建议并不适合您转换并将文字的每次使用转换为s
版本.如果您对char
s 数组的限制很好,请使用它.建议是,如果你要将这个字面存储在a中std::string
,最好完成它,而它仍然是文字而不是模糊不清const char*
.
Che*_*Alf 19
使用建议"blah"s
与效率无关,而与新手代码的正确性无关.
没有C背景的C++新手倾向于认为"blah"
导致某个合理字符串类型的对象.例如,这样人们就可以编写像"blah" + 42
许多脚本语言一样的东西.与"blah" + 42
在C++中,然而,一个刚刚即被未定义行为,寻址超出字符数组的末尾.
但是,如果将该字符串文字写入,"blah"s
则会产生编译错误,这是更可取的.
Jar*_*d42 13
此外,UDL使\0
字符串更容易
std::string s = "foo\0bar"s; // s contains a \0 in its middle.
std::string s2 = "foo\0bar"; // equivalent to "foo"s
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3192 次 |
最近记录: |