如何解决在销毁右值之前是否隐含着移动语义?
在以下功能中:
void SetObject(Object object)
{
m_Object = object;
}
SetObject
将收到object
的副本,该副本是分配给m_Object
的右值,并立即超出范围。
是否将隐含移动语义,以便不会不必要地创建object
的第二个副本?似乎应该暗示移动语义,尽管我可能会遗漏一些东西。换句话说,我需要这样写吗?
void SetObject(Object object)
{
m_Object = std::move(object);
}
解决方法
是的,您确实需要{{1}}才能避免复制。
, # frozen_string_literal: true
alphabet = %w(a b c)
alphabet = alphabet.map do |letter|
letter + 'suffix'
end
的{{1}}参数可能已经通过调用站点的右值进行了初始化,但在object
内部肯定不是一个右值,它是一个左值(因为它有一个名称)。
因此:
SetObject()
将执行{em>复制到SetObject()
中,而不是移动。
您需要显式使用void SetObject(Object object)
{
m_Object = object;
}
来将m_Object
强制转换为右值,以便将 move 转换为std::move()
(假设object
支持移动语义,否则将执行 copy ):
m_Object
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。