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

时间:2016-06-06 13:42:06

标签: c++ return language-lawyer

我有以下成员函数:

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

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

由于

2 个答案:

答案 0 :(得分:11)

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

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

  

之前对呼叫结果的复制初始化进行了排序   在充分表达结束时对临时的破坏   由return语句的操作数建立,反过来,是   在破坏局部变量([stmt.jump])之前排序   包含return语句的块

答案 1 :(得分:-1)

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

  

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

的规定予以淘汰