我有以下成员函数:
Person ClassB::DoSomethingAndReturnPerson()
{
RAIIMutex myLock(&m_mutex);
return m_person;
}
RAIIMutex
是一个辅助类,它接收互斥体并将其锁定在构造函数中并在析构函数中释放。
m_person
属于类型Person
(尺寸非常小的东西)。其他线程中的其他函数可能会更改此成员。
我想回来m_person
按值(返回副本),当然我想避免出现以下情况:m_person
在另一个线程中更改它,同时在返回中复制它,因此我添加了锁。
但首先会发生什么?编译器是否首先创建一个副本m_person
或者首先调用析构函数myLock
?
理论上,通过执行以下操作很容易解决:
Person ClassB::DoSomethingAndReturnPerson()
{
RAIIMutex myLock(&m_mutex);
Person tmp = m_person;
return tmp;
}
但我有兴趣知道我的问题的答案。
Thanks
返回值的复制初始化将在之前进行处理。
从标准来看,[stmt.return]/3(强调我的)
调用结果的复制初始化在之前排序
完整表达结束时临时体的破坏
由 return 语句的操作数建立,反过来,是
在销毁局部变量([stmt.jump])之前排序
包含 return 语句的块.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)