![]() |
1
4
如果您考虑的是一个自定义的、支持移动的字符串类,那么利用参数值类别的每个组合的正确方法是:
pr值 而不是 X值 . 返回 X值 通常是非常危险的事情–std::move和std::forward是明显的例外。如果要返回一个rvalue引用,则需要按如下方式分解代码:
此循环的行为(根据N3092中的6.5.4/1)就像代码是:
这反过来又会导致一个悬空引用。临时对象的生存期不会延长,因为操作符+不返回 pr值 . 按值返回对象非常好。它将创建临时对象,但这些对象是r值,因此我们可以窃取它们的资源以使其非常有效。 其次,您的代码也不应该编译,原因与它不编译的原因相同:
函数体内部 是左值,不能用左值表达式初始化“return value”(在本例中是rvalue引用)。所以,你需要一个明确的演员阵容。 第三,缺少const&+const&重载。如果两个参数都是左值,编译器将无法在您的情况下找到可用的运算符+。 如果不希望有这么多重载,还可以编写:
我故意不写
至少这种情况非常有效,因为即使编译器无法删除副本,也不会涉及不必要的复制—这要感谢支持移动的字符串类。实际上,使用一个类类似STD::string,可以利用它的快速交换成员函数,并使它在C++ 03中有效,同时也提供了一个合理的智能编译器(如GCC):
见大卫亚伯拉罕的文章 Want Speed? Pass by Value 但这些简单的运算符在以下情况下不会那么有效:
在这里,运算符的左侧始终是左值。由于运算符+按值取其左侧,因此会产生许多副本。上面的四个重载也完美地处理了这个示例。 可以 在C++ 03中有效地连接多个字符串:
我实际上查看了Git源代码及其字符串管理(strbuf.h)。它看起来经过深思熟虑。除了detach/attach特性之外,使用支持移动的std::string也可以得到同样的效果,它的明显优点是它自动管理的资源由类本身来管理,而不是需要记住在正确的时间调用正确函数的用户(strbuf_init,strbuf_release)。 |
![]() |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
![]() |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
![]() |
rainer · 后台插入程序的初始化 1 年前 |
![]() |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
|
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
|
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |