使用用户定义的字面值而不是string字面值的优点

SO文档中的string主题在备注部分用来说:

因为C ++ 14不是使用"foo" ,所以推荐使用"foo"s ,因为s是一个string,将const char * "foo"std::string "foo"

我看到的唯一优势

 std::string str = "foo"s; 

代替

 std::string str = "foo"; 

在第一种情况下,编译器可以执行copy-elision(我认为),这比第二种情况下的构造函数调用要快。

尽pipe如此,(尚未)保证,所以第一个也可能调用构造函数,复制构造函数。

忽略需要使用std::string文字的情况

 std::string str = "Hello "s + "World!"s; 

使用std::string文字而不是const char[]文字有什么好处吗?

如果你是“几乎总是自动”的人群的一部分,那么UDL是非常重要的。 它可以让你这样做:

 auto str = "Foo"s; 

因此, str将是一个真正的std::string ,而不是一个const char* 。 因此它允许你决定什么时候该做什么。

这对于自动返回types扣除也很重要:

 []() {return "Foo"s;} 

或者任何forms的演绎,真的是:

 template<typename T> void foo(T &&t) {...} foo("Foo"s); 

我所看到的唯一优点是,在第一种情况下,编译器可以执行copy-elision(我认为),这比第二种情况下的构造器调用要快。

Copy-elision不会比构造函数调用更快。 无论哪种方式,你调用对象的构造函数之一。 问题是哪一个

 std::string str = "foo"; 

这将引发对std::string的构造函数的调用,该函数使用一个const char* 。 但是由于std::string必须将string复制到自己的存储中,所以它必须得到string的长度。 由于它不知道长度,所以这个构造函数被迫使用strlen来获取它(技术上, char_traits<char>::length ,但这可能不会更快)。

相比之下:

 std::string str = "foo"s; 

这将使用具有此原型的UDL模板:

 string operator "" s(const char* str, size_t len); 

看, 编译器知道string文字的长度。 所以UDL代码传递一个指向string和大小的指针。 因此,它可以调用带有const char* size_tstd::string构造const char* 。 所以不需要计算string的长度。

有问题的build议是不适合你去转换一个文字的使用到s版本。 如果你对char数组的局限性没有问题,可以使用它。 build议是,如果你打算把这个文字存储在一个std::string ,那么最好把它当成一个文字,而不是一个含糊的const char*

使用"blah"sbuild议与效率无关,都与新手代码的正确性有关。

在C中没有背景的C ++新手往往会认为"blah"导致一些合理的stringtypes的对象。 例如,可以写一些像"blah" + 42这样的东西,这个东西在许多脚本语言中都有效。 然而,在C ++中使用"blah" + 42 ,只会导致未定义行为,寻址超出字符数组的末尾。

但是,如果这个string文字被写为"blah"s那么会得到一个编译错误,这是非常可取的。

另外,UDL使string中的\0更容易

 std::string s = "foo\0bar"s; // s contains a \0 in its middle. std::string s2 = "foo\0bar"; // equivalent to "foo"s 
  1. 使用C ++string,意味着我们不需要调用strlen来计算长度。 编译器已经知道了。
  2. 可能允许库实现string数据指向全局空间中的内存将使用C文字必须始终强制一个数据的副本堆积内存中的build设。