我有以下成员函数:
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;
}
但我有兴趣知道我的问题的答案。
由于
答案 0 :(得分:11)
返回值的复制初始化将在之前处理。
从标准[stmt.return]/3(强调我的)
之前对呼叫结果的复制初始化进行了排序 在充分表达结束时对临时的破坏 由return语句的操作数建立,反过来,是 在破坏局部变量([stmt.jump])之前排序 包含return语句的块。
答案 1 :(得分:-1)
在“代码的最后一行”之后调用本地对象的析构函数。以下是标准(3.7.3 / 3)的相关引用:
如果具有自动存储持续时间的变量已初始化或a 具有副作用的析构函数,在结束前不得销毁 它的块,即使它也不会作为优化被消除 似乎未使用,除了类对象或其复制/移动可能 按照12.8
的规定予以淘汰