返回值的复制构造函数何时发生

When is the copy constructor for the return value happens

本文关键字:何时发 构造函数 复制 返回值      更新时间:2023-10-16

我有以下成员函数:

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;
}

但我有兴趣知道我问题的答案。

谢谢

返回值的复制初始化将在之前处理。

从标准来看,[stmt.return]/3(强调我的)

调用结果的复制初始化在之前排序 在完整表达结束时对临时者的破坏 由 return 语句的操作数建立,而 return 语句又是 在局部变量 ([stmt.jump]) 的破坏之前排序 包含 return 语句的块

本地对象的析构函数在"代码的最后一行"之后调用。以下是标准(3.7.3/3)的相关引用:

如果具有自动存储持续时间的变量具有初始化或 有副作用的析构函数,在结束前不得销毁 的块,也不应将其作为优化消除,即使它 似乎未使用,除了类对象或其复制/移动可能 按照 12.8 中的规定消除