C++ 如何优化右值参数的返回值以避免复制

C++ 如何优化右值参数的返回值以避免复制,c++,C++,我正在编写一个网络模块,使用信封模型,下面是一个sent函数,函数参数使用右值引用: Envelope Nattransport::发送(信封和信封) { //做点什么。。。 如果(!natsConnection->Send(envelope.GetContent(),envelope.Length())) { 返回信封。带有(“信封发送失败”); } 返回信封;//调用信封的复制构造函数 //return std::move(信封);//调用信封的复制构造函数 } 模板 带有(Args&&…

我正在编写一个网络模块,使用信封模型,下面是一个sent函数,函数参数使用右值引用:

Envelope Nattransport::发送(信封和信封)
{
//做点什么。。。
如果(!natsConnection->Send(envelope.GetContent(),envelope.Length()))
{
返回信封。带有(“信封发送失败”);
}
返回信封;//调用信封的复制构造函数
//return std::move(信封);//调用信封的复制构造函数
}
模板
带有(Args&&…Args)常量的信封
{
//调用With方法时
//称为信封。这符合设计预期,
//因为向信封中添加邮票不会修改旧信封。
返回(std::make_shared(std::forward(args)…);
}
但当它返回时,我发现它调用了信封的副本构造函数

有没有办法避免调用复制构造函数并使用移动语义

我使用调试模式跟踪断点,并找到了复制构造函数的调用


注意:我尝试实现move构造函数,但在返回值时它似乎不起作用

class信封最终版
{
公众:
信封::信封(常量信封和其他)
{
偏移量=其他。偏移量;
长度=other.length;
content_uu=其他。content_uu;
邮票=其他。邮票;
}
信封(信封和其他)
{
偏移量=其他。偏移量;
长度=other.length;
content=std::move(other.content);
邮票=标准::移动(其他.邮票);
}
信封和运算符=(常量信封和其他)无例外
{
如果(此==&其他)
{
归还*这个;
}
偏移量=其他。偏移量;
长度=other.length;
content_uu=其他。content_uu;
邮票=其他。邮票;
归还*这个;
}
信封和运算符=(信封和其他)无例外
{
如果(此==&其他)
{
归还*这个;
}
偏移量=其他。偏移量;
长度=other.length;
content=std::move(other.content);
邮票=标准::移动(其他.邮票);
归还*这个;
}
私人:
尺寸偏移量=0;
大小与长度=1;
std::shared\u ptr content\uu=nullptr;
标准::地图邮票;
}
移动常量对象(如您的原始帖子所示)选择常规复制构造函数而不是移动构造函数

您需要
信封(const-Envelope&&)
,它实际上很少使用

当参数不是常量时

返回std::move(信封)
应调用move构造函数(如果可用)

返回信封
调用复制构造函数。在某些情况下,如果
envelope
是一个局部变量,则调用move,但这不是您的情况(这里是一个(右值-)引用)。

移动常量对象(如您最初的帖子中所述)会选择常规复制构造函数而不是移动构造函数

您需要
信封(const-Envelope&&)
,它实际上很少使用

当参数不是常量时

返回std::move(信封)
应调用move构造函数(如果可用)


返回信封
调用复制构造函数。在某些情况下,如果
envelope
是一个局部变量,则调用move,但这不是您的情况(这里是(右值-)引用)。

常量envelope&
这没有意义。您几乎不需要常量值引用。删除常量。从来没有好的理由创建
const
r值引用。信封是否有移动构造函数?请提供一个@AlanBirtles,我试图实现move构造函数,但在返回值时它似乎不起作用。我试图编译。如果
返回std::move(信封)调用移动构造函数。请提供更多详细信息。
const信封&
这毫无意义。您几乎不需要常量值引用。删除常量。从来没有好的理由创建
const
r值引用。信封是否有移动构造函数?请提供一个@AlanBirtles,我试图实现move构造函数,但在返回值时它似乎不起作用。我试图编译。如果
返回std::move(信封)调用移动构造函数。请提供更多的细节。是的,你是正确的,当我移除const时,移动构造函数被称为正确的,但是我更好奇,为什么C++设计了这样的方式,以及为什么它会导致调用不同构造函数的结果。const对象不绑定到非const(rValst)引用,所以唯一可行的候选是复制构造函数。是的,你是正确的,当我移除const时,移动构造函数被称为正确的,但是我更好奇,为什么C++会这样设计,重载解析选择可行重载之间的最佳匹配。常量对象不绑定到非常量(右值)引用,因此唯一可行的候选对象是复制构造函数。