|
|
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)。 |
|
AstralHex · 矩阵乘法代码工作不正常 1 年前 |
|
|
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 1 年前 |
|
|
Die4Toast · 递归调用成员箭头运算符-> 1 年前 |
|
|
Anka Hanım · 关于结构和动态数组地址的问题 1 年前 |